终于自己做出来第一个带权并查集了!!!
虽然这题和真正的难题有一定差距,毕竟第一次尝试嘛,还算顺利。
这题就是给出的两个数,不是同一个性别,比如给出1 3,1和3就不是同一种性别,如果有说明和上面的情况矛盾,就输出Suspicious bugs found!,如果所有情况都没有矛盾的话,输出No suspicious bugs found!。
0表示同类,1表示不同类。
#include<iostream> #include<cstdio> #include<cctype> #include<cstdlib> #include<cmath> #include<algorithm> #include<cstring> #include<string> #include<vector> #include<queue> #include<map> #include<set> #include<sstream> #include<stack> using namespace std; #define MAX 2000+5 typedef long long LL; const double pi=3.141592653589793; const int INF=1e9; const double inf=1e20; const double eps=1e-10; const int mod=1000000007; int fa[MAX]; int tmp[MAX]; int Find(int x){ if(fa[x]==x) return fa[x]; int tem=fa[x]; fa[x]=Find(fa[x]); tmp[x]=(tmp[x]+tmp[tem])%2; return fa[x]; } void Union(int a,int b,int c,int d){ fa[c]=d; tmp[c]=(tmp[a]+tmp[b]+1)%2; } int main(){ int t,kase=0; cin>>t; while(t--){ kase++; int n,m; int flag=0; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ fa[i]=i; tmp[i]=0; } for(int i=0;i<m;i++){ int a,b; scanf("%d%d",&a,&b); if(!flag){ int c=Find(a); int d=Find(b); if(c!=d) Union(a,b,c,d); else{ if(tmp[a]==tmp[b]){ printf("Scenario #%d:\nSuspicious bugs found!\n",kase); flag=1; } } } else continue; } if(!flag) printf("Scenario #%d:\nNo suspicious bugs found!\n",kase); printf("\n"); } return 0; }