题目信息:http://poj.org/problem?id=2492
就是种类并查集的一种,如果理解食物链的思想,这道题应该不是问题,都是用向量的思想理解,代码如下:
#include<stdio.h>
struct node
{
int f;
int r;
} s[20010];
int find(int x)
{
int temp;
if(x==s[x].f) return x;
temp=s[x].f;
s[x].f=find(temp);
s[x].r=(s[x].r+s[temp].r)%2;
return s[x].f;
}
int main()
{
int t,m,n,i;
int x,y;
int tot=1;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=1; i<=n; i++)
{
s[i].f=i;
s[i].r=0;
}
bool flog=true;
for(i=1; i<=m; i++)
{
scanf("%d%d",&x,&y);
if(flog)
{
int rootx=find(x);
int rooty=find(y);
if(rootx==rooty)
{
if(s[x].r==s[y].r)
flog=false;
}
else
{
s[rooty].f=rootx;
s[rooty].r=(s[x].r+1-s[y].r+2)%2;
}
}
}
printf("Scenario #%d:\n",tot++);
if(flog==false) printf("Suspicious bugs found!\n\n");
else printf("No suspicious bugs found!\n\n");
}
}