很美妙的感觉 复现和梳理脑中思路的时候会很舒服 灵感乍现就如同炸毛,敲出来就如同细细理顺 算法
#include<bits/stdc++.h>
using namespace std;const int N= 205;
vector<int>E[N];map<string,int>mp;
int dp[N][2],f[N][2];
void dfs(int u){
dp[u][1]=1,dp[u][0]=0;
for(int i=0;i<E[u].size();i++){
int v=E[u][i];
dfs(v);
if(dp[v][0]==dp[v][1]){
f[u][0]=0;
dp[u][0]+=dp[v][0];
}else if(dp[v][0]>dp[v][1]){
dp[u][0]+=dp[v][0];
if(!f[v][0])f[u][0]=0;
}else{
dp[u][0]+=dp[v][1];
if(!f[v][1])f[u][0]=0;
}
dp[u][1]+=dp[v][0];
if(!f[v][0])f[u][1]=0;
}
}
int main(){
ios::sync_with_stdio(false);
int n,k;
string s1,s2;
while(cin>>n&&n){
mp.clear();
for(int i=0;i<=n;i++){
E[i].clear();
}
memset(f,1,sizeof(f));
k=1;
cin>>s1;
mp[s1]=k++;
E[0].push_back(mp[s1]);
//E[0].push_back(k); 完全没注意到这里错了 k++后mp[s1]!=k
for(int i=1;i<n;i++){
cin>>s1>>s2;
if(mp[s1]==0)mp[s1]=k++;
if(mp[s2]==0)mp[s2]=k++;
E[mp[s2]].push_back(mp[s1]);
}
dfs(0);
cout<<dp[0][0]<<" ";
if(f[0][0])cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}