A Bug's Life
又是一道坑爹的英文题。。。题目好难翻译啊!!!为减轻大家翻译负担,特地把题目大意叙述如下:
有个教授在搞虫子是否为同性恋的实验。。。(有点怪怪的感觉。。。)通过实验的一些结果,判断教授的观点是否正确,也就是判断实验的虫子中是否存在同性恋的虫子!
输入:第一个数输入实验的次数。接下来一行输入实验的虫子数n和研究的虫子对数m。接下来m行分别输入交配的m对虫子。
输出:如果观点正确(即没有发现同性恋虫子),则输出:Suspicious bugs found! 否则输出:No suspicious bugs found!每个场景输出:Scenario #n:
题解:这道题就是并查集的变形题。题目的难点就在于要判断两虫子是否为同性恋,不妨设一个数组来存储每个虫子的性别。由于刚开始都不知道哪一只虫子是哪种性别。所以这里我们用到一个异或的判断方法。通过异或计算可以知道两种虫子是否为同一性别。若为同一性别直接结束。若不是则继续寻找下去。
代码:
#include<iostream>
#define MAX 2005
using namespace std;
int flag,m,n,ans[MAX],tree[MAX];
void init(int n)
{
int i;
for(i=1;i<=n;i++)
{
ans[i]=0;
tree[i]=i;
}
flag=1;
}
int getfather(int x)
{
int rt;
if(x!=tree[x])
{
rt=getfather(tree[x]);
ans[x]=ans[x]^ans[tree[x]];
return tree[x]=rt;
}
return x;
}
void Union(int x,int y)
{
int fx,fy;
fx=getfather(x);
fy=getfather(y);
if(fx==fy)
flag=ans[x]^ans[y];
else{
tree[fx]=fy;
ans[fx]=~(ans[x]^ans[y]);
}
}
int main()
{
int i,j,t,a,b;
cin>>t;
for(j=1;j<=t;j++)
{
cin>>n>>m;
init(n);
for(i=1;i<=m;i++)
{
cin>>a>>b;
if(flag)
Union(a,b);
}
if (flag)
printf("Scenario #%d:\nNo suspicious bugs found!\n", j);
else
printf("Scenario #%d:\nSuspicious bugs found!\n", j);
if (i != t) printf("\n");
}
return 0;
}