题目
题解思路
0和1代表两种类型,当两个点权值差距为0时,就是找出BUG了。
合并入树和压缩路径时对2取模即可。
带权并查集模板
坑点
多组输入权值数组和祖先数组要初始化!
AC代码
#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
int a[2010];
int w[2010];
int find2 (int x)
{
if ( x != a[x] )
{
int t = a[x];
a[x] = find2(a[x]);
w[x] = (w[x] + w[t])%2;
}
return a[x];
}
int main ()
{
int t,sum = 1;
scanf("%d",&t);
while(t--)
{
int n,k,flag = 0;
scanf("%d%d",&n,&k);
for (int i = 0 ; i <= n ; i++ )
{
a[i] = i;
w[i] = 0;
}
for (int i = 1; i <= k ; i++ )
{
int x,y;
scanf("%d%d",&x,&y);
if ( flag != 0 )
continue;
int fx = find2(x);
int fy = find2(y);
if ( fx == fy)
{
if ( (w[x]-w[y]+2)%2 != 1 )
{
flag = 1;
}
}else
{
a[fx] = fy;
w[fx] = ( -w[x] + 1 + 2 + w[y] )%2;
}
}
printf("Scenario #%d:\n",sum);
sum++;
if (flag == 0)
printf("No suspicious bugs found!\n");
else
printf("Suspicious bugs found!\n");
printf("\n");
}
return 0;
}