uva 1120

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<queue>
#include<vector>
#include<sstream>
#include<cmath>
#include<queue>
#include<cctype>
#include<set>
#include<map>
#include<unordered_set>
using namespace std;

int cur;
map<string, int>m;
vector<vector<int> >v;
int ID(string s){
   if(!m.count(s)) m[s] = cur++;
   return m[s];
}
int d[202][2], f[202][2];

int dp(int i, int k){
   d[i][k] = k;
   f[i][k] = 1;
   for(int j = 0; j < v[i].size(); j++){
      if(k){
         d[i][k] += dp(v[i][j],0);
         if(!f[v[i][j]][0]) f[i][k] = 0;
      }
      else{
         d[i][k] += max(dp(v[i][j], 0),dp(v[i][j], 1));
         if(d[v[i][j]][1] == d[v[i][j]][0] ) f[i][k] = 0;
         else if(d[v[i][j]][1] > d[v[i][j]][0]  && !f[v[i][j]][1])  f[i][k] = 0;
         else if(d[v[i][j]][1] < d[v[i][j]][0] && !f[v[i][j]][0])   f[i][k] = 0;
      }
   }
   return d[i][k];
}

int main(){
   int n;
   string s;
   while(scanf("%d",&n)== 1 && n){
      cin>>s;
      v.clear();
      m.clear();
      cur = 0;
      v.resize(n);
      ID(s);
      for(int i = 1;i < n; i++){
          string a,b;
          cin>>a>>b;
          v[ID(b)].push_back(ID(a));
      }
      printf("%d ",max(dp(0,0), dp(0,1)));
      if(d[0][0] == d[0][1]) cout<<"No";
      else if(d[0][0] > d[0][1] && !f[0][0]) cout<<"No";
      else if(d[0][0] < d[0][1] && !f[0][1]) cout<<"No";
      else cout<<"Yes";
      cout<<endl;
   }
   return 0;
}

猜你喜欢

转载自blog.csdn.net/a874288174/article/details/80034079