树的最大独立集,但是要判断唯一性。有些像是dfs。另外发现std::ios::sync_with_stdio(0)不能与scanf并用!
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<string> 5 #include<vector> 6 #include<map> 7 #define pb push_back 8 using namespace std; 9 const int maxn=205; 10 int n; 11 string a[3][maxn]; 12 map<string,int> mp; 13 vector<int> vt[maxn]; 14 int dp(int u,int p,bool &f) 15 { 16 f=1; 17 int ans=p; 18 if(p==1) for(int i=0;i<vt[u].size();i++)//如果选了u,那么u的子节点都不能选。 19 { 20 int v=vt[u][i]; 21 bool t; 22 ans+=dp(v,0,t); 23 if(t==0) f=0; 24 } 25 else for(int i=0;i<vt[u].size();i++)//如果没有选u,那么其子节点可以选也可以不选。 26 { 27 int v=vt[u][i]; 28 bool t1,t2; 29 int d1=dp(v,0,t1),d2=dp(v,1,t2); 30 ans+=max(d1,d2); 31 if((d1>d2&&!t1)||(d1<d2&&!t2)||(d1==d2)) f=0; 32 } 33 return ans; 34 } 35 int main() 36 { 37 while(scanf("%d",&n)&&n) 38 { 39 mp.clear(); 40 for(int i=1;i<=n;i++) 41 { 42 cin>>a[1][i]; 43 if(i>1) cin>>a[2][i]; 44 mp[a[1][i]]=i; 45 vt[i].clear(); 46 } 47 for(int i=2;i<=n;i++) 48 vt[mp[a[2][i]]].pb(i); 49 bool t1,t2; 50 int d1=dp(1,0,t1),d2=dp(1,1,t2); 51 printf("%d ",max(d1,d2)); 52 if((d1>d2&&t1)||(d2>d1&&t2)) printf("Yes "); 53 else printf("No "); 54 } 55 }