这道题就是判断是不是一棵树,,,判断有无环,是不是在一个集合,,节点数减去边数=1三个条件就可以了。需要注意的地方就是,空树也是符合题目要求的。
题目:
Is It A Tree?
Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4567Accepted Submission(s): 1087
There is exactly one node, called the root, to which no directed edges point.
Every node except the root has exactly one edge pointing to it.
There is a unique sequence of directed edges from the root to each node.
For example, consider the illustrations below, in which nodes are represented by circles and edges are represented by lines with arrowheads. The first two of these are trees, but the last is not.



In this problem you will be given several descriptions of collections of nodes connected by directed edges. For each of these you are to determine if the collection satisfies the definition of a tree or not.
#include <iostream>
#include <string.h>
#include <string>
#include <cstdio>
using namespace std;
int leftt[10005],rightt[10005],father[10005];
int find(int x){
if(father[x]==-1)
return x;
return find(father[x]);
}
void unionset(int x,int y){
father[y]=x;
}
int main(){
//freopen("1.txt","r",stdin);
int a,b;
int count=1;
while(1){
memset(father,-1,sizeof(father));
memset(leftt,0,sizeof(leftt));
memset(rightt,0,sizeof(rightt));
scanf("%d%d",&a,&b);
if(a<0&&b<0)
return 0;
else if(a==0&&b==0)
printf("Case %d is a tree.\n",count++);
else{
int i=1;
leftt[i]=a;rightt[i]=b;
while(scanf("%d%d",&a,&b)&&a&&b){
i++;
leftt[i]=a;
rightt[i]=b;
}
int flag=1;
for(int j=1;j<=i;++j){
int x=find(leftt[j]);
int y=find(rightt[j]);
if(x==y||y!=rightt[j]){
flag=0;
break;
}
unionset(x,y);
}
if(flag){
int xx=find(leftt[1]);
//printf("xx====%d\n",xx);
int tt;
for(tt=2;tt<=i;++tt){
if(xx!=find(leftt[tt]))
break;
//printf("tt====%d\n",find(leftt[tt]));
}
if(tt>i)
printf("Case %d is a tree.\n",count++);
else
printf("Case %d is not a tree.\n",count++);
}
else
printf("Case %d is not a tree.\n",count++);
}
}
return 0;
}