判断bug中是否有guy。。。。。。。。。。
用n和n+max表示逻辑正反两反面,两个同一集合内的两个都小于max代表有相同,一个小于一个大于代表不同
#include <iostream>
using namespace std;
const int maxn = 10010;
int pre[2*maxn];
int n,m;
int p1,p2;
int total;
int find(int x){
int i,j,r;
r = x;
while(r != pre[r]){
r = pre[r];
}
i = x;
while(i != r){
j = pre[i];
pre[i] = r;
i = j;
}
return r;
}
void join(int x , int y){
int fx = find(x);
int fy = find(y);
if(fx != fy){
pre[fx] = fy;
--total;//不要放在外面。因为有一种输入是(1 2) (1 2),这样的话total就减重复了
}
}
int main(){
int t;
scanf("%d",&t);
int counter = 1;
while(t--){
int i;
for(i = 0 ; i < 2*maxn ; ++i){
pre[i] = i;
}
scanf("%d%d",&n,&m);
bool flag = true;
for(i = 0 ; i < m ; ++i){
int a,b;
scanf("%d%d",&a,&b);
if(find(a) == find(b)){
flag = false;
}else{
join(a,b+maxn);
join(a+maxn,b);
}
}
printf("Scenario #%d:\n",counter++);
// printf(flag?"No suspicious bugs found!\n\n":"Suspicious bugs found!\n\n");
if(flag){
printf("No suspicious bugs found!\n\n");
}else{
printf("Suspicious bugs found!\n\n");
}
}
return 0;
}