View Code
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 using namespace std; 6 7 int n,len; 8 char name[201][101]; 9 int dp[201][2]; 10 int special[201][2]; 11 vector <int> G[201]; 12 13 int max(int a,int b) 14 { 15 if(a > b) return a; 16 return b; 17 } 18 19 int find(char *str) 20 { 21 int i = 0; 22 while(i < len && strcmp(str,name[i]) != 0) 23 i++; 24 if(i == len) return -1; 25 return i; 26 } 27 28 int insert(char *str) 29 { 30 strcpy(name[len],str); 31 len++; 32 return len - 1; 33 } 34 35 void init() 36 { 37 int i; 38 for(i = 0;i <= n;i++) 39 G[i].clear(); 40 memset(name,0,sizeof(name)); 41 memset(dp,0,sizeof(dp)); 42 memset(special,0x1,sizeof(special)); 43 len = 0; 44 } 45 46 void dfs(int v) 47 { 48 for(vector<int>::size_type i = 0;i < G[v].size();i++) 49 { 50 int u = G[v][i];//u是v的儿子节点 51 dfs(u); 52 dp[v][0] += max(dp[u][0],dp[u][1]); 53 dp[v][1] += dp[u][0]; 54 55 if(dp[u][0] == dp[u][1]) 56 special[v][0] = 0; 57 else if(dp[u][0] > dp[u][1] && special[v][0]) 58 special[v][0] = special[u][0]; 59 else if(dp[u][0] < dp[u][1] && special[v][0]) 60 special[v][0] = special[u][1]; 61 if(special[v][1]) 62 special[v][1] = special[u][0]; 63 } 64 dp[v][1]++; 65 } 66 67 int main() 68 { 69 char str[101]; 70 while(scanf("%d",&n),n) 71 { 72 init(); 73 scanf("%s",str); 74 insert(str); 75 int p,q; 76 77 for(int i = 1;i < n;i++) 78 { 79 scanf("%s",str); 80 if((p = find(str)) == -1) 81 p = insert(str); 82 scanf("%s",str); 83 if((q = find(str)) == -1) 84 q = insert(str); 85 G[q].push_back(p); 86 } 87 88 dfs(0); 89 90 int ans = max(dp[0][1],dp[0][0]); 91 printf("%d ",ans); 92 93 if(dp[0][0] == dp[0][1]) 94 printf("No\n"); 95 else if(dp[0][0] == ans && special[0][0] == 0) 96 printf("No\n"); 97 else if(dp[0][1] == ans && special[0][1] == 0) 98 printf("No\n"); 99 else 100 printf("Yes\n"); 101 } 102 return 0; 103 }