这道题是并查集的一个应用
分析清题意后并不是很难
在一堆虫子和一些关系中找出是否存在同性恋的虫子= = !
定义一个数组op[] ,op[x]=y,表示x,y是不同性别,也就是在不同的集合
初始化op[i]=0;
输入一对数,找到他们的集合代表元素,如果相等,则证明它们在同一个集合,则找到了同性恋虫子,flag=1;
如果不等,那么如果此时op[x]=0,op[y]=0,2个集合都没有元素,则op[x]=y,op[y]=x;
如果x对应的集合中有元素,则把y并入这个集合,如果Y对应的集合有元素,则把x并入op[y]所在的集合。
#include<stdio.h>
#include<string.h>
int fa[2010];
int op[2010];
int find(int x)
{
if(x!=fa[x])
fa[x]=find(fa[x]);
return fa[x];
}
int main()
{
int t;
scanf("%d",&t);
for(int ii=1;ii<=t;ii++)
{
int n,m;
scanf("%d%d",&n,&m);
int i,j;
for(i=1;i<=n;i++)
{
fa[i]=i;
op[i]=0;
}
int x,y;
int flag=0;
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
int fx=find(x);
int fy=find(y);
if(fx==fy)
{
flag=1;
}
else
{
if(op[x]!=0)
{
int fo=find(op[x]);
fa[fo]=fy;
}
else if(op[y]!=0)
{
int f1=find(op[y]);
fa[f1]=fx;
}
else
{
op[x]=y;
op[y]=x;
}
}
}
printf("Scenario #%d:\n",ii);
if(flag==1)
printf("Suspicious bugs found!\n\n");
else
printf("No suspicious bugs found!\n\n");
}
return 0;
}