思路:这题很容易想到状态,就是当前节点u选与不选,其某子节点v。那么dp[i][j]其中i为节点编号,j表示为选(1)与不选(0)。
显然:
选u,dp[u][1] += dp[v][0],再就是唯一性的判定。
不选u,dp[u][0] += max(dp[v][1],dp[v][0]),再就是唯一性的判定。
走到叶子节点时,dp[v][0] = 0,dp[v][1] = 1,
/*****************************************
Author :Crazy_AC(JamesQi)
Time :2015
File Name :
*****************************************/
// #pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <sstream>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <map>
#include <set>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <limits.h>
using namespace std;
#define MEM(a,b) memset(a,b,sizeof a)
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> ii;
const int inf = 1 << 30;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
inline int Readint(){
char c = getchar();
while(!isdigit(c)) c = getchar();
int x = 0;
while(isdigit(c)){
x = x * 10 + c - '0';
c = getchar();
}
return x;
}
map<string,int> mp;
vector<int> G[100010];
int dp[100010][2];
int mark[100010][2];
void dfs(int u){
if (G[u].size() == 0){
dp[u][0] = 0;
dp[u][1] = 1;
return;
}
dp[u][1]++;
for (int i = 0;i < G[u].size();++i){
int v = G[u][i];
dfs(v);
dp[u][1] += dp[v][0];
if (mark[v][0])
mark[u][1] = 1;
if (dp[v][0] > dp[v][1]){
dp[u][0] += dp[v][0];
if (mark[v][0]) mark[u][0] = 1;
}else{
dp[u][0] += dp[v][1];
if (dp[v][1] == dp[v][0] || mark[v][1])
mark[u][0] = 1;
}
}
}
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int n;
while(~scanf("%d",&n) && n){
memset(dp, 0,sizeof dp);
memset(mark, 0,sizeof mark);
mp.clear();
string a,b;
cin >> a;
int cnt = 0;
mp[a] = ++cnt;
for (int i = 0;i <= n;i++)
G[i].clear();
for (int i = 1;i <= n - 1;i++){
cin >> a >> b;
if (!mp[a]) mp[a] = ++cnt;
if (!mp[b]) mp[b] = ++cnt;
G[mp[b]].push_back(mp[a]);
}
dfs(1);
if (dp[1][1] == dp[1][0]){
printf("%d No\n",dp[1][1]);
}else if (dp[1][1] > dp[1][0]){
printf("%d %s\n",dp[1][1],mark[1][1]?"No":"Yes");
}else printf("%d %s\n",dp[1][0],mark[1][0]?"No":"Yes");
}
return 0;
}