#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define MAX 100002
using namespace std;
int father[MAX],rank[MAX];
void init(int n)
{
for(int i = 1; i <=n; i ++)
father[i] = i;
memset(rank,0,sizeof(rank));
}
int find(int x)
{
if(x!=father[x])
{
int temp = father[x];
father[x] = find(father[x]);
rank[x] = (rank[x] + rank[temp])%2;
}
return father[x];
}
int Union(int x,int y)
{
int a = find(x);
int b = find(y);
if(a == b) return 1;
father[a] = b;
rank[a] = (rank[y]+1-rank[x])%2; //向量关系式根指向
return 0;
}
int main()
{
int a,b,m,n,stu,ans;
scanf("%d",&n);
for(int i = 1; i <=n; i ++)
{
cin>>stu>>m;
init(stu);
ans = 0;
for(int j = 1; j <=m; j++)
{
scanf("%d %d",&a,&b);
if(find(a)==find(b))
{
if(rank[a]==rank[b])
ans = 1;
}
else
Union(a,b);
}
if(ans == 1)
printf("Scenario #%d:\nSuspicious bugs found!\n\n",i);
else
printf("Scenario #%d:\nNo suspicious bugs found!\n\n",i);
}
return 0;
}
hdu1829向量法
最新推荐文章于 2021-03-24 23:28:26 发布