首页 > 其他 > 详细

HDU 1829 A Bug's Life (并查集)

时间:2015-01-17 22:14:51      阅读:339      评论:0      收藏:0      [点我收藏+]

题目链接:请戳这里。

题目大意及思路:给定n个Bugs(shen me gui)和m对Bugs之间的关系,假定关系是两个Bugs的男女关系,那么问存不存在同性恋的情况。

那么若a与b是男女关系,b与c是男女关系,那么a和c的性别我们就可以认为是相同的。我们用可以建立两个并查集,一类放男男关系,一类放女女关系。

那么若男男关系中出现了环的情况(即有共同的根),那么同性恋关系就出现了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define N 2000+10
using namespace std;

int ok;
int f[N],p[N]; //用p[]表示男女关系。
void Init(int n)
{
    for(int i=1;i<=n;i++)
    {
        f[i]=i;
        p[i]=0;
    }
}
int Find(int x)
{
    return x==f[x]?x:f[x]=Find(f[x]);
}
void Merge(int a,int b) //a和b有男女关系。
{
    int ra=Find(a),rb=Find(b);
    if(ra==rb) {  //存在同性恋。
        ok=0;
        return;
    }
    if(p[ra]) f[p[ra]]=rb; //p[ra]和rb是同种关系(男男)
    if(p[rb]) f[p[rb]]=ra; //p[rb]和ra是同种关系(女女)
    p[ra]=rb;
    p[rb]=ra;
}
int main()
{
    int T,C=0;
    scanf("%d",&T);
    while(T--)
    {
        int n,m;
        scanf("%d %d",&n,&m);
        Init(n);  ok=1;
        for(int i=0;i<m;i++)
        {
            int a,b;
            scanf("%d %d",&a,&b);
            Merge(a,b);
        }
        printf("Scenario #%d:\n",++C);
        if(ok) puts("No suspicious bugs found!");
        else puts("Suspicious bugs found!");
        puts("");
    }
    return 0;
}


HDU 1829 A Bug's Life (并查集)

原文:http://blog.csdn.net/darwin_/article/details/42809659

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!