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

来源:互联网 发布:中国移动数据漫游 编辑:程序博客网 时间:2024/06/03 20:06

利用yix[]这个数组来标记性别关系,然后把性别相同的Bug合并到一个集合,然后发现两只Bug在同一个集合便返回有可疑的Bug。

#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn=2008;int yix[maxn],fa[maxn];void init(int n){    for(int i=1; i<=n; i++)    {        fa[i]=i;        yix[i]=0;    }}int find(int x){    return fa[x]==x?x:find(fa[x]);}void merge(int a,int b){    int x=find(a);    int y=find(b);    if(x!=y)        fa[x]=y;}int main(){    int T;    scanf("%d",&T);    for(int i=1; i<=T; i++)    {        int flag=0;        int n,m,a,b;        scanf("%d%d",&n,&m);        init(n);        while(m--)        {            scanf("%d%d",&a,&b);            if(!yix[a]&&!yix[b])            {                yix[a]=b;                yix[b]=a;            }            else if(!yix[a]&&yix[b])            {                yix[a]=b;                merge(a,yix[b]);            }            else if(yix[a]&&!yix[b])            {                yix[b]=a;                merge(b,yix[a]);            }            else            {                merge(yix[a],b);                merge(yix[b],a);            }            if(find(a)==find(b)) flag=1;        }        printf("Scenario #%d:\n",i);        if(flag) printf("Suspicious bugs found!\n");        else  printf("No suspicious bugs found!\n");        printf("\n");    }    return 0;}

0 0