注:这道题思路很乱,先记下,日后理清
题意:给出一些节点,判断这些节点构成的是不是一棵树
思路:感觉很简单,但是思路又很乱,当时想的判断条件是:
1.入度不能大于1(树根为0,其他节点为1)
2.所有节点必须在一棵树中(判断所有节点是否在一棵树中)
3.在节点相连的时候,不能是同一棵树中的节点(否则会出现环或者入度为2的情况)
#include#include #include using namespace std;int set[50000];int a[50000];int rootnum[50000];int set_find(int d){ if(set[d]<0) return d; return set[d]=set_find(set[d]);//这里不要忘了return(有的编译器可能是自动加上return,在vc中不会报错,运行结果也正确)}void join(int x,int y){ x=set_find(x); y=set_find(y); set[x]=y;}int main(){ int i; int m; int mcase=0; while(1) { bool ok=true; memset(set,-1,sizeof(set)); memset(rootnum,0,sizeof(rootnum)); i=0; m=0; scanf("%d%d",&a[i],&a[i+1]); m++;m++; mcase++; if(a[i]<0 &&a[i+1]<0) break; if(a[i]!=0 &&a[i+1]!=0) { if(set_find(a[i+1])!=set_find(a[i]))// 3. 连得时候不能是同一棵树中的两个节点相连(排除自己连自己) join(a[i+1],a[i]); else ok=false; rootnum[a[i+1]]++; i++;i++; while(scanf("%d%d",&a[i],&a[i+1])) { if(a[i]==0 &&a[i+1]==0)break; m++;m++; if(set_find(a[i])!=set_find(a[i+1]))// 3. 连得时候不能是同一棵树中的两个节点相连 { join(a[i+1],a[i]); } else ok=false; rootnum[a[i+1]]++; i++;i++; } } int root=set_find(a[0]); for(i=0;i 1||set_find(a[i])!=root)// 1.入度不能大于1 , 2.所有节点必须在一棵树中 { ok=false; break; } } if(ok) printf("Case %d is a tree.\n",mcase); else printf("Case %d is not a tree.\n",mcase); } return 0;}