您的位置:首页 > Web前端

(Relax 并查集1.1)POJ 2492 A Bug's Life(并查集的基本使用)

2013-11-24 20:43 531 查看
判断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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: