Uva-1220

树的最大独立集,但是要判断唯一性。有些像是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 }
原文地址:https://www.cnblogs.com/windrises/p/4805005.html