您的位置:首页 > Web前端

hdu 1829 A Bug's Life 并查集

2015-07-13 08:27 369 查看
hdu1829链接:点击打开链接

本想用vector写,没写出来/衰,看了一下结题报告,哎,我真的没学会并查集。利用并查集,当根节点相同的时候,观察两点与根节点的关系 是同性还不异性,重点是在查找根节点的时候就要更新各点与爷爷的关系

code:

#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
int n,m;
int father[2100],relation[2100];//1表示同性,0表示异性
void init(int n)
{
    for(int i=0;i<=n;i++)
    {
        father[i]=i;
        relation[i]=1;
    }
}
int findd(int n)
{
    int nn=father
;
    if(n==father
)
        return nn;          
    father
=findd(nn);
    relation
=(relation
+relation[nn]+1)%2;
    return father
;
}
void uniont(int a,int b,int aa,int bb)
{
    father[aa]=bb;
    relation[aa]=(relation[a]-relation[b])%2;
}
int main()
{
    //freopen("i.txt","r",stdin);
    int i,tt=0,t;
    scanf("%d",&t);
    while(t--)
    {
        tt++;
        scanf("%d%d",&n,&m);
        init(n);
        int a,b,flag=0;
        for(i=0;i<m;i++)
        {
            scanf("%d%d",&a,&b);
            if(flag)
                continue;
            int aa=findd(a);
            int bb=findd(b);
            if(aa==bb)
                if(relation[a]==relation[b])
                    flag=1;
            uniont(a,b,aa,bb);
        }
            printf("Scenario #%d:\n",tt);
        if(flag)
            printf("Suspicious bugs found!\n\n");
        else
            printf("No suspicious bugs found!\n\n");
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: