您的位置:首页 > 其它

[kuangbin带你飞]专题五 并查集 J POJ 2492

2016-10-17 22:08 435 查看
题目地址:https://vjudge.net/contest/66964#problem/J

思路:0,1分别代表与根节点相同与不同。如果两个节点的根节点相同,而且这两个节点与根节点关系又是相同的,则说明有错误。

AC代码:

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=2000+10;
int fa[maxn];
int sum[maxn];
int t,n,m;

int find(int p)
{
if(p!=fa[p])
{
int pre=fa[p];
fa[p]=find(fa[p]);
sum[p]=(sum[p]+sum[pre])%2;
}
return fa[p];
}

int main()
{
scanf("%d",&t);
for(int casei=1;casei<=t;casei++)
{
for(int i=0;i<maxn;i++)
{
fa[i]=i;
sum[i]=0;
}
scanf("%d%d",&n,&m);
int flag=0;
for(int i=1;i<=m;i++)
{
int p,q;
scanf("%d%d",&p,&q);
int s=1;
int fp=find(p);
int fq=find(q);
//printf("%d %d\n",fp,fq);
if(fp==fq)
{
if(s!=abs(sum[p]-sum[q]))
{
flag=1;
}
}
else
{
fa[fq]=fp;
sum[fq]=(sum[p]+sum[q]+s)%2;
}
}
if(flag)
printf("Scenario #%d:\nSuspicious bugs found!\n",casei);
else
printf("Scenario #%d:\nNo suspicious bugs found!\n",casei);
if(casei<t)
printf("\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: