一开始用pii保存dp类型,写的很长,还是WA了= =。。
然后参考了一下别人的博客,重新写了一发(似乎是岐哥的博客233)。
代码如下:
1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 #include <iostream> 5 #include <string> 6 #include <vector> 7 #include <map> 8 using namespace std; 9 const int N = 200 + 5; 10 11 int n; 12 map<string,int> M; 13 vector<int> G[N]; 14 int tot = 0; 15 int dp[N][2]; 16 void dfs(int u) 17 { 18 dp[u][0] = 0; 19 dp[u][1] = 1; 20 for(int i=0;i<G[u].size();i++) 21 { 22 int v = G[u][i]; 23 dfs(v); 24 dp[u][0] += max(dp[v][1], dp[v][0]); 25 dp[u][1] += dp[v][0]; 26 } 27 } 28 29 int main() 30 { 31 while(scanf("%d",&n) == 1 && n) 32 { 33 for(int i=1;i<=n;i++) G[i].clear(); 34 tot = 0; 35 M.clear(); 36 37 string boss; 38 cin >> boss; 39 M[boss] = ++tot; 40 for(int i=1;i<n;i++) 41 { 42 string a,b; 43 cin >> a >> b; 44 if(M[a] == 0) M[a] = ++tot; 45 if(M[b] == 0) M[b] = ++tot; 46 int u = M[a], v = M[b]; 47 G[v].push_back(u); 48 } 49 50 dfs(1); 51 printf("%d ",max(dp[1][0], dp[1][1])); 52 int flag = dp[1][0] != dp[1][1]; 53 for(int i=1;i<=n&&flag;i++) 54 { 55 if(dp[i][0] < dp[i][1]) continue; 56 for(int j=0;j<G[i].size()&&flag;j++) 57 { 58 int v = G[i][j]; 59 if(dp[v][1] == dp[v][0]) 60 { 61 flag = 0; 62 break; 63 } 64 } 65 } 66 puts(flag ? "Yes" : "No"); 67 } 68 return 0; 69 }
想说明的一点是,博客里面的判断是否有多种可能的if条件应当是dp[i][0] >= dp[i][1],虽然两者都能AC,但是我觉得这样更加妥当一些。