题意:确定树上的最大独立集是否唯一 和求出树上最大独立集的大小
解法:对于每一个状态,我们都要进行标记 然后构造出像转移方程一样的数组 标记当前状态是否唯一即可
#include<map>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
#define maxn 11111
map<string,int>mp;
vector<int>g[maxn];
char ss[maxn],s1[maxn];
int n,cnt,dp[maxn][2],fl[maxn][2];
void dfs(int u){
for(int i=0;i<g[u].size();++i){
int v=g[u][i];
dfs(v);
dp[u][0]+=max(dp[v][0],dp[v][1]);
if(dp[v][0]==dp[v][1]){fl[u][0]=1;}
if(dp[v][1]>dp[v][0]&&fl[v][1]){fl[u][0]=1;}
else if(dp[v][1]<dp[v][0]&&fl[v][0]){fl[u][0]=1;}
dp[u][1]+=dp[v][0];
if(fl[v][0]){fl[u][1]=1;}
}
++dp[u][1];
}
void init(){
mp.clear();cnt=0;
for(int i=0;i<=n;++i){
dp[i][0]=dp[i][1]=0;g[i].clear();
fl[i][0]=fl[i][1]=0;
}
}
int main(){
while(~scanf("%d",&n),n){
init();
scanf("%s",ss);mp[ss]=1;
++cnt;
for(int i=0;i<n-1;++i){
scanf("%s%s",ss,s1);
if(!mp[ss])mp[ss]=++cnt;
if(!mp[s1])mp[s1]=++cnt;
g[mp[s1]].push_back(mp[ss]);
}
dfs(1);
int ma=max(dp[1][0],dp[1][1]);printf("%d ",ma);
if(dp[1][0]==dp[1][1])printf("No\n");
else if(dp[1][0]==ma){
printf(fl[1][0]==0?"Yes\n":"No\n");
}else{
printf(fl[1][1]==0?"Yes\n":"No\n");
}
}
return 0;
}