题意:给出点、边,判断是不是一棵树
思路:问题是如何判断是不是树?
我总结了一下,但不官方,正确性待验证。
1.入度<=1(根节点为0,其他为1)
2.不能有环
3.只有一个根节点
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; #define MAXN 50000 int fa[MAXN]; int a[MAXN]; int in[MAXN]; int set_find(int d){ if(fa[d]<0)return d; return fa[d]=set_find(fa[d]); } void set_join(int x,int y){ x=set_find(x); y=set_find(y); if(x!=y)fa[x]=y; } int main(){ int x,y,m=0,sum,i,tc=0; bool flag=true; memset(fa,-1,sizeof(fa)); memset(in,0,sizeof(in)); while(~scanf("%d%d",&x,&y)){ if(x==-1&&y==-1)break; if(x==0&&y==0){ if(flag==false)printf("Case %d is not a tree. ",++tc); else{ sum=0; for(i=0;i<m;++i)//条件3:只有一个根节点 if(fa[a[i]]==-1)++sum; if(sum==1)printf("Case %d is a tree. ",++tc); else printf("Case %d is not a tree. ",++tc); } m=0; flag=true; memset(fa,-1,sizeof(fa)); memset(in,0,sizeof(in)); continue; } a[m++]=x; a[m++]=y; if(in[y]==1)flag=false;//条件1:入度小于等于1 if(set_find(x)==set_find(y))flag=false;//条件2:不能有环 else { set_join(x,y); ++in[y]; } } return 0; }