#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
*/
Graph Theory NO.3 HDU_1325_Is It A Tree_并查集
猜你喜欢
转载自blog.csdn.net/m0_37862025/article/details/78187040
今日推荐
周排行