NYOJ 129判定树
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 5 #define N 10010 6 int parent[N],in[N]; 7 bool visit[N]; 8 9 int find(int x) 10 { 11 if(x == parent[x]) return x; 12 return find(parent[x]); 13 } 14 15 int max(int a,int b) 16 { 17 return a>b ? a:b; 18 } 19 20 int main() 21 { 22 // freopen("in.txt","r",stdin); 23 int i,k=1,a,b,maxn=0; 24 memset(visit,false,sizeof(visit)); 25 memset(in,0,sizeof(in)); 26 for(i=0; i<N; ++i) parent[i] = i; 27 int flag = 1; 28 while(cin>>a>>b) 29 { 30 if(a == -1 && b == -1) break; 31 if(a == 0 && b == 0) 32 { 33 int t=0; 34 for(i=0; i<=maxn; ++i) 35 { 36 if(visit[i] && i == parent[i]) 37 t++; 38 } 39 if(t>1) flag = 0; 40 if(flag) 41 cout<<"Case "<<k++<<" is a tree.\n"; 42 else 43 cout<<"Case "<<k++<<" is not a tree.\n"; 44 memset(visit,false,sizeof(visit)); 45 memset(in,0,sizeof(in)); 46 for(i=0; i<N; ++i) parent[i] = i; 47 flag = 1;maxn=0; 48 } 49 else 50 { 51 maxn = max(maxn,max(a,b)); 52 visit[a] = visit[b] = true; 53 in[b]++; 54 if(in[b]>1) flag = 0; 55 if(!flag) continue; 56 int x = find(a); 57 int y = find(b); 58 if(x != y) 59 parent[y] = x; 60 else 61 flag = 0; 62 } 63 } 64 return 0; 65 } 66 67 //总结:存储父亲结点,因为孩子结点只可能为1(即入度只能为1)。
//代码二:
#include <iostream>
using namespace std;
int node[10001];
bool visited[10001];
int find(int i){
if(i == node[i]) return i;
return find(node[i]);
}
int main()
{
int a, b, k = 1, i;
bool flag;
for(i = 0; i < 10001; ++i){ node[i] = i; visited[i] = false;}
flag = false;
while(cin>>a>>b){
if(a == -1 && b == -1) break;
if(a || b){
visited[a] = visited[b] = true;
if(flag) continue;
if(node[b] == b && find(a) != b){ //只有一个父亲结点且无环
node[b] = a;
}
else flag = true;
}
else{
int t = 0;
for(i = 0; i < 10001; ++i)
if(visited[i] && i == node[i])
++t; //根结点的个数是否只有一个?
if(t > 1) flag = true;
if(!flag) cout<<"Case "<<k++<<" is a tree.\n";
else cout<<"Case "<<k++<<" is not a tree.\n";
for(i = 0; i < 10001; ++i){node[i] = i; visited[i] = false;}
flag = false;
}
}
return 0;
}