带权并查集模2系,也就是给一些关系 ,这些关系是是否同类。问有多少关系错的。
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int M = 2e3+7; int _,n,m,cas=1; int f[M],cnt[M]; void init(){ for(int i=0;i<=n;i++) f[i]=i,cnt[i]=0; } int find(int x){ if(x==f[x]) return x; int tmp=f[x]; f[x]=find(f[x]); cnt[x]=(cnt[x]+cnt[tmp])%2; return f[x]; } int main(){ freopen("1.in","r",stdin); freopen("1.out","w",stdout); scanf("%d",&_); while(_--){ scanf("%d%d",&n,&m); init(); int flg=1; while(m--){ int u,v; scanf("%d%d",&u,&v); if(u<v) swap(u,v); int fu=find(u),fv=find(v); if(fu==fv){ if((cnt[u]-cnt[v]+2)%2!=1) flg=0; } else{ f[fu]=fv; cnt[fu]=(cnt[v]-cnt[u]+1+2)%2; } } printf("Scenario #%d:\n",cas++); if(flg) printf("No suspicious bugs found!\n\n"); else printf("Suspicious bugs found!\n\n"); } return 0; }