POJ 3342 Party at HaliBula

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 }
原文地址:https://www.cnblogs.com/zhexipinnong/p/2717283.html