• 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
Copyright © 2020-2023  润新知