码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-01-17 22:15:57      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:a bugs life   hdu 1829   professor hopper   并查集   hdu   

题目链接:请戳这里。

题目大意及思路:给定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 (并查集)

标签:a bugs life   hdu 1829   professor hopper   并查集   hdu   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!