终于自己做出来第一个带权并查集了!!!
虽然这题和真正的难题有一定差距,毕竟第一次尝试嘛,还算顺利。
这题就是给出的两个数,不是同一个性别,比如给出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;
}