并查集_HDU_1325

来源:互联网 发布:网络举报网站 编辑:程序博客网 时间:2024/06/04 17:44

日了狗啊,大水题中有大水坑,还要判断入度没有超过2的

#include<cstdio>const int maxn = 100005;int par[maxn],rot[maxn],flag,vis[maxn],d[maxn];void Init(){    for(int i = 0; i < maxn; i++)    {        par[i] = i;        rot[i] = 0;        vis[i] = 0;        d[i] = 0;    }}int Find(int x){    if(x == par[x])        return x;    int t = Find(par[x]);    return par[x] = t;}void Union(int x, int y){    x = Find(x);    y = Find(y);    if(x == y){flag = 1;return;}    if(rot[x]>rot[y])    {        par[y] = x;    }    else    {        par[x] = y;        rot[y]++;    }}int main(){    int n,m;    int num = 0;    while(scanf("%d%d",&n,&m) != EOF)    {        if(n<0 && m<0)            break;        if(n == 0 && m == 0)        {            printf("Case %d is a tree.\n",++num);            continue;        }        Init();        flag = 0;        vis[n]=vis[m] = 1;        d[m]++;        Union(n,m);        while(scanf("%d%d",&n,&m))        {            if(n == 0 && m == 0)                break;            vis[n]=vis[m] = 1;            d[m]++;            if(d[m]>=2)                flag = 1;            Union(n,m);        }        int cnt = 0;        for(int i = 1; i < maxn; i++)            if(vis[i] && par[i] == i)                cnt++;        if(cnt > 1)flag = 1;        if(!flag)            printf("Case %d is a tree.\n",++num);        else            printf("Case %d is not a tree.\n",++num);    }    return 0;}
0 0
原创粉丝点击