您的位置:首页 > 其它

POJ 1308 Is It A Tree?

2013-11-06 13:40 253 查看
并查集题型。

就是检查他们是否是一棵树。

明确树的构成。是否有多个点接在一个点上。

POJ AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[10010],c[10010],v[10010];
void intt(int n)
{
    for(int i=1;i<=n;i++)
    a[i]=i,c[i]=0,v[i]=0;
}
int findset(int x)
{
    if(a[x]!=x)
    a[x]=findset(a[x]);
    return a[x];
}
void unionset(int x,int y)
{
    x=findset(x),y=findset(y);
    if(x==y)return ;
    a[y]=x;
}
int main()
{
    int n,m,tmp=0,cont=1;bool ok=1;
    intt(10010);
    while(~scanf("%d%d",&n,&m),n>=0||m>=0)
    {
        tmp=max(tmp,max(n,m));
        if(n==0&&m==0)
        {
            int sum=0;
            for(int i=1;i<=tmp;i++)
            {
                if(v[i]==1&&findset(i)==i)
                sum++;
                if(c[i]>1){ok=0;break;}
            }
            if(sum>1)ok=0;
            if(ok)printf("Case %d is a tree.\n",cont++);
            else printf("Case %d is not a tree.\n",cont++);
            intt(10010),tmp=0,ok=1;
            continue;
        }
        if(m!=n&&findset(n)==findset(m)||m==n)
        ok=0;
        else
        {
            c[m]++;
            v
=v[m]=1;
            unionset(n,m);
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: