Graph Theory NO.3 HDU_1325_Is It A Tree_并查集

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
#define M 100009
int k=1;
int father[M];
int d[M];//入度
int mark[M];
void Init(int n)//初始化
{
    for(int i=1;i<=n;i++)
    {
        father[i]=i;
    }
}

int Find(int n)//查找根
{
    if(n!=father[n])
    {
        father[n]=Find(father[n]);
    }
    return father[n];
}

int Union(int n,int m)
{
    if(n==m)
        return 0;
    else
    {
        father[n]=m;
    }
    return 0;
}
int main()
{
    int a,b;
    memset(d,0,sizeof(d));
    int num=0;
    int flag=0;
    Init(M);
    int count=0;
    memset(mark,0,sizeof(mark));
    while(~scanf("%d%d",&a,&b))
    {
        if(a<0&&b<0)
            break;
        if(a!=0&&b!=0)
        {
            mark[num++]=a;
            mark[num++]=b;
            if(father[a]==father[b])
            {
                flag=1;
                //printf("*1\n");
            }
            Union(Find(a),Find(b));
            d[b]++;
        }
        else
        {
            for(int i=0;i<num;i++)
            {
                if(d[mark[i]]>1)
                {
                    flag=1;
                    //printf("*2\n");
                }
                if(father[mark[i]]==mark[i])
                {
                    count++;
                    //printf("*3\n");
                }
            }
            if(count>1)
            {
                flag=1;
                //printf("*4\n");
            }
            if(flag==0)
            {
                printf("Case %d is a tree.\n",k++);
            }
            else
            {
                printf("Case %d is not a tree.\n",k++);
            }
            memset(d,0,sizeof(d));
            memset(mark,0,sizeof(mark));
            num=0;
            flag=0;
            Init(M);
            count=0;
        }
    }
    return 0;
}
/*
6 8 5 3 5 2 6 4
5 6 0 0
8 1 7 3 6 2 8 9 7 5
7 4 7 8 7 6 0 0
3 8 6 8 6 4
5 3 5 6 5 2 0 0
*/

猜你喜欢

转载自blog.csdn.net/m0_37862025/article/details/78187040