poj2492A Bug's Life

来源:互联网 发布:上帝之眼网络摄像头app 编辑:程序博客网 时间:2024/06/07 04:43

一位伟大的教授想研究一群生物中是否存有同性恋,他以假设法来做这项实验。他每次将两个生物放到一起交配并假设他俩为异性,一旦这个假设出现了矛盾,则这群生物中肯定有同性恋。在他的实验中,单个个体以及和他们匹配的个体很容易认出,因为每个生物的背上都印上了数字。
给出每一对生物编号,判断这个实验能否支持教授的假设:这群生物中有同性恋或者没有。
输入:
第一行:几组实验
第二行:生物的个数<2000和几次交配x<1000000(用一个空格分开)
接下来的x行:每行是两个交配的生物的编号
输出:
如果教授一开始的假设是错的,那么输出“scenario”+ “#实验号”和结论-“Suspicious bugs found!”
Input:
2
3 3
1 2
2 3
1 3
4 2
1 2
3 4
输出:
Scenario #1:
Suspicious bugs found!

Scenario #2:
No suspicious bugs found!

#include<stdio.h>int f[2005],r[2005];int fs(int i){if(f[i]==i)   return i;int t=f[i];f[i]=fs(f[i]);               r[i]=(r[t]+r[i])%2; return f[i];}void un(int x,int y){int a=fs(x),b=fs(y);f[a]=b;r[a]=(r[y]-r[x]+1)%2;       //r[a]+r[x]与r[y]相对于新的父节点必须相差1个等级,因为他们不是gay}int main(){int cases,n,m,i,k,x,y;scanf("%d",&cases);for(k=1;k<=cases;k++){   int flag=0;   scanf("%d %d",&n,&m);   for(i=1;i<=n;i++)   {    f[i]=i;    r[i]=0;   }   for(i=1;i<=m;i++)   {    scanf("%d %d",&x,&y);    if(fs(x)==fs(y))    {     if(r[x]!=(r[y]+1)%2)      flag=1;    }    else     un(x,y);   }   if(flag)    printf("Scenario #%d:\nSuspicious bugs found!\n\n",k);   else    printf("Scenario #%d:\nNo suspicious bugs found!\n\n",k);}return 0;}
0 0
原创粉丝点击