hdu 1829 并查集

这道题是并查集的一个应用

分析清题意后并不是很难

 

在一堆虫子和一些关系中找出是否存在同性恋的虫子= = !

 

定义一个数组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;
}




 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值