有没有大佬指导一下我这个线性基做法哪里出了问题
查看原帖
有没有大佬指导一下我这个线性基做法哪里出了问题
836104
cxlian25楼主2023/3/21 17:05
#include <bits/stdc++.h>
using namespace std;
const int N=603;
int n,m,cnt=1;
int t[38];
set<int>s[43];
struct ed{
    int b[38];
}a[38],c;
void to(int x,int y){
    for(auto i=s[x].begin();i!=s[x].end();i++){
        int tt=*i;
        if(s[y].find(tt)==s[y].end()){
            s[y].insert(tt);
        }
        else s[y].erase(tt);
    }
}

int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        int u,v;
        scanf("%d%d",&u,&v);
        a[u].b[v]=1;
        a[v].b[u]=1;
    }
    for(int i=1;i<=n;i++)a[i].b[i]=1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(!a[i].b[j])continue;
            if(!t[j]){
                t[j]=i;
                s[i].insert(i);
                break;
            }
            else{
                for(int k=j;k<=n;k++){
                    a[i].b[k]^=a[t[j]].b[k];
                }
                to(t[j],i);
            }
        }
    }
    for(int i=1;i<=n;i++){
        c.b[i]=1;
    }
    for(int i=1;i<=n;i++){
        if(!c.b[i])continue;
        for(int j=i;j<=n;j++){c.b[j]^=a[t[i]].b[j];}
        to(t[i],40);
    }
    printf("%d",s[40].size());
    return 0;
}
2023/3/21 17:05
加载中...