并查集方法
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<map>
#include<algorithm>
#include<memory.h>
using namespace std;
int fa[100010],ru[100010];
int s[100010],cnt,num;
int _fa(int v)
{
if(v==fa[v]) return v;
fa[v]=_fa(fa[v]);
return fa[v];
}
int main()
{
int a,b;
int faa,fab;
int Case=0;
bool flag=true;
while(1){
flag=true;//更新
memset(fa,0,sizeof(fa));
memset(ru,0,sizeof(ru));
cnt=0;
while(scanf("%d%d",&a,&b)&&a&&b){
if(a<0||b<0) return 0;
if(fa[a]==0) {fa[a]=a;s[++cnt]=a;}//离散化
if(fa[b]==0) {fa[b]=b;s[++cnt]=b;}
faa=_fa(a);
fab=_fa(b);
ru[b]++;
if(ru[b]>1) flag=false;
if(faa==fab) flag=false;
fa[fab]=faa;
}
faa=_fa(s[1]);//判断是否联通
for(int i=2;i<=cnt;i++){
fab=_fa(s[i]);
if(faa!=fab){
flag=false;
break;
}
}
if(flag) printf("Case %d is a tree.
",++Case);
else printf("Case %d is not a tree.
",++Case);
}
return 0;
}
边顶关系
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int f[100005];
int main()
{
int a,b,flag,i,j;
int t=1;
while(1)
{
j=0;
i=0;
flag=0;
memset(f,0,sizeof(f));
while(scanf("%d%d",&a,&b)&&a&&b)
{
if(a<0||b<0)
return 0;
if(f[b]-1==1)
flag=1;
if(f[a]==0)
j++;
if(f[b]==0)
j++;
f[a]=1;f[b]=2;i++;
}
if(flag==0&&j==i+1)
printf("Case %d is a tree.
",t++);
else printf("Case %d is not a tree.
",t++);
}
}