zoukankan      html  css  js  c++  java
  • 【树形DP】 HDU 2412 Party at Hali-Bula


    给出根节点(BOSS)

    然后还有N-1个边  A B 由B指向A (B为A 的上司)

    每次仅仅能选择这个关系中的当中一个

    求最多选几个点 

    而且输出是不是唯一的

    重点推断是否唯一:

    1.若下属不去和去都人数一样的话则上司不去的话就不唯一(上司去了下属必然不能去。所以不满足)

    2.若下属不去还不唯一的话  上司去了也是不唯一

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <climits>
    #include <cctype>
    #include <cmath>
    #include <string>
    #include <sstream>
    #include <iostream>
    #include <algorithm>
    #include <iomanip>
    using namespace std;
    #include <queue>
    #include <stack>
    #include <vector>
    #include <deque>
    #include <set>
    #include <map>
    typedef long long LL;
    #define pi acos(-1.0)
    #define lson l, m, rt<<1
    #define rson m+1, r, rt<<1|1
    map<string ,int >mp;
    const int maxn=10000;
    vector<int > G[201];
    int col[203][2],vis[203],dp[203][2];
    void init()
    {
        for(int i=0; i<=200; i++)
            G[i].clear();
        mp.clear();
        memset(vis,0,sizeof(vis));
        memset(dp,0,sizeof(dp));
        memset(col,0,sizeof(col));
    }
    void dfs(int u)
    {
        if(vis[u]) return ;
        vis[u]=1;
        dp[u][1]=1;
        col[u][1]=col[u][0]=1;
        for(int i=0; i<G[u].size(); i++)
        {
            int v=G[u][i];
            if(!vis[v])
            {
                dfs(v);
                dp[u][1]+=dp[v][0];
                dp[u][0]+=max(dp[v][1],dp[v][0]);
                if(dp[v][0]==dp[v][1])//推断唯一
                    col[u][0]=false;
                if(!col[v][0])
                    col[u][1]=false;
            }
        }
    }
    int main()
    {
    #ifndef ONLINE_JUDGE
        freopen("in.txt", "r", stdin);
        // freopen("out.txt", "w", stdout);
    #endif
        int n;
        string s,s1,s2;
        while(~scanf("%d", &n),n)
        {
            int tol=0;
            init();
            cin>>s;
            mp[s]=++tol;
            for(int i=0; i<n-1; i++)
            {
                cin>>s1>>s2;
                if(mp[s1]==0)
                    mp[s1]=++tol;
                if(mp[s2]==0)
                    mp[s2]=++tol;
                int a=mp[s1],b=mp[s2];
                G[b].push_back(a);
            }
            dfs(1);
            printf("%d ",max(dp[1][0],dp[1][1]));
            if(dp[1][0]>dp[1][1]&&col[1][0]||dp[1][0]<dp[1][1]&&col[1][1])
                puts("Yes");
            else  puts("No");
        }
        return 0;
    }
    


  • 相关阅读:
    O-C相关-06:对象与对象的关系
    O-C相关05:方法的封装.
    O-C相关04:类方法的概述与定义和调用
    Objective-C发展历史
    O-C相关-03:面向对象概念的具体介绍
    OC相关-02:oc和c的基本差异
    0-C相关01:NSlog函数介绍。
    鞭辟入里
    objective-c中字符串长度计算
    OC多文件开发介绍
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7390242.html
Copyright © 2011-2022 走看看