有一些昆虫,给出若干它们的配对关系,判断其中是否有虫子搞基。
一开始也是想到并查集,但是没有想到怎么实现,后来参考了一下人家的做法。
精髓是要设一组变量,标记每只虫子的第一个对象。边读取数据,边更新这组变量和并查集,直到找到基佬就OK。
#include<iostream>
#include<cstdio>
using namespace std;
typedef struct{
int father;
int com;
} NODE;
NODE bug[2200];
void init(int x){
for(int i = 1; i <= x; i++){
bug[i].father = i;
bug[i].com = -1;
}
}
int find(int x){
if(x == bug[x].father)
return x;
else
return bug[x].father = find(bug[x].father);
}
void join(int x, int y){
int r1 = find(x);
int r2 = find(y);
bug[r1].father = r2;
}
int main(){
int T, caseNo = 0;
scanf("%d", &T);
while(T--){
int n, m;
scanf("%d %d", &n, &m);
init(n);
bool found = false;
while(m--){
int x, y;
scanf("%d %d", &x, &y);
if(found)
continue;
if(bug[x].com == -1){
if(bug[y].com == -1){
bug[x].com = y;
bug[y].com = x;
}else{
join(x, bug[y].com);
bug[x].com = y;
}
}else{
if(bug[y].com == -1){
join(bug[x].com, y);
bug[y].com = x;
}else{
if(find(x) == find(y))
found = true;
else{
join(bug[x].com, y);
join(bug[y].com, x);
}
}
}
}
printf("Scenario #%d:\n", ++caseNo);
if(found)
printf("Suspicious bugs found!\n");
else
printf("No suspicious bugs found!\n");
if(T != 0)
printf("\n");
}
}