标签:
根据树的特点:
要注意的问题就是:0 0 是棵树
用结构体,分别记录标记、入度和根
然后就分别判断:
不要产生环的情况
不要入度大于1的情况
不要多根的情况
#include<stdio.h> const int max_num = 100000 + 10; typedef struct { int num,root,conn; }Node; Node node[max_num]; void init() { for(int i=0;i<max_num;i++){ node[i].conn=0; node[i].root=i; node[i].num=0; } } int find_root(int a){ if(node[a].root!=a) return node[a].root = find_root(node[a].root); return node[a].root; } void union_set(int a,int b){ a = find_root(a); b = find_root(b); if(a == b) return ; node[b].root = a; } int main() { int n,m; int i=1; bool flag = true; init(); while(scanf("%d%d",&n,&m)!=EOF&&n>=0&&m>=0){ if(!flag&&n!=0&&m!=0) continue; if(n==0&&m==0){ int root_num=0; for(int j=1;j<max_num;j++){ if(node[j].num && find_root(j)==j) root_num++; if(node[j].conn>1){ flag =false; break; } } if(root_num > 1) flag = false; if(flag) printf("Case %d is a tree.\n",i++); else printf("Case %d is not a tree.\n",i++); flag = true; init(); continue; } if(m!=n&&find_root(n)==find_root(m)) flag = false; else { node[m].num = 1; node[n].num = 1; node[m].conn++; union_set(n,m); } } return 0; }
标签:
原文地址:http://blog.csdn.net/a197p/article/details/46045319