poj2492A Bug's Life

一位伟大的教授想研究一群生物中是否存有同性恋,他以假设法来做这项实验。他每次将两个生物放到一起交配并假设他俩为异性,一旦这个假设出现了矛盾,则这群生物中肯定有同性恋。在他的实验中,单个个体以及和他们匹配的个体很容易认出,因为每个生物的背上都印上了数字。
给出每一对生物编号,判断这个实验能否支持教授的假设:这群生物中有同性恋或者没有。
输入:
第一行:几组实验
第二行:生物的个数<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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值