树形dp poj 2342

题目链接:poj 2342

题目大意:某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上司,现在已知每个人的活跃指数和上司关系(当然不可能存在环),求邀请哪些人(多少人)来能使得晚会的总活跃指数最大。

思路:既然是树形dp,自然先建立一颗树了,这里用的是邻接表(L<-K)。找根的时候利用flag数组来标记所有儿子节点,那么没有标记的自然是根节点了。树形dp从叶子节点开始dp,所以深搜到叶子节点,然后不断回溯给父节点。在处理儿子节点时,父节点不参加的话儿子节点,取去与不去中的最大值;父亲节点参加那么儿子节点就不能去了。这里定义dp[][2],0表示不去,1表示去。具体运用参看代码。。。。。。。。。。。。。

/**************************************************************
    Problem:poj 2342
    User: youmi
    Language: C++
    Result: Accepted
    Time:16MS
    Memory:408K
****************************************************************/
//#pragma comment(linker, "/STACK:1024000000,1024000000")
//#include<bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <stack>
#include <sstream>
#include <cmath>
#include <queue>
#include <string>
#include <vector>
#define zeros(a) memset(a,0,sizeof(a))
#define ones(a) memset(a,-1,sizeof(a))
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define rep0(i,n) for(int i=0;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define Max(a,b) (a)>(b)?(a):(b)
#define Min(a,b) (a)<(b)?(a):(b)
#define pt(a) printf("%d\n",a)
#define lson (step<<1)
#define rson (lson+1)
#define esp 1e-6
#define oo 0x3fffffff
#define TEST cout<<"*************************"<<endl

using namespace std;
typedef long long ll;
int n;
const int maxn=6000+10;
int dp[maxn][2];
int vis[maxn];
int head[maxn];
int flag[maxn];
int T;
struct side
{
    int v,next;
}e[maxn];
void init()
{
    T=0;
    zeros(vis);
    zeros(dp);
    zeros(flag);
    ones(head);
}
void build(int u,int v)
{
    e[T].v=v;
    e[T].next=head[u];
    head[u]=T++;
}
void tree_dp(int root)
{
    vis[root]=1;
    //pt(root);
    for(int i=head[root];~i;i=e[i].next)
    {
        int v=e[i].v;
        if(!vis[v])
        {
             tree_dp(v);
             dp[root][1]+=dp[v][0];
             dp[root][0]+=Max(dp[v][1],dp[v][0]);
        }
    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    /**<  int T_T;sc(T_T);
    for(int kase=1;kase<=T_T;kase++)*/
    //while(~sc(n))
    sc(n);
    {
        init();
        int root;
        rep1(i,n)
        {
            sc(dp[i][1]);
        }
        int u,v;
        rep1(i,n-1)
        {
            sc2(u,v);
            //printf("%d %d\n",u,v);
            build(v,u);
            flag[u]=1;
        }
        rep1(i,n)
        {
            if(!flag[i])
            {
                root=i;
                break;
            }
        }
        //pt(root);
        tree_dp(root);
        pt(Max(dp[root][1],dp[root][0]));
    }
    return 0;
}
时间: 2024-11-12 02:49:51

树形dp poj 2342的相关文章

树形DP [POJ 1155] TELE

TELE Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3787   Accepted: 2007 Description A TV-network plans to broadcast an important football match. Their network of transmitters and users can be represented as a tree. The root of the tre

树形DP [POJ 1947] Rebuilding Roads

Rebuilding Roads Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 9249   Accepted: 4198 Description The cows have reconstructed Farmer John's farm, with its N barns (1 <= N <= 150, number 1..N) after the terrible earthquake last May. The

(树形DP) poj 3659

Cell Phone Network Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5916   Accepted: 2119 Description Farmer John has decided to give each of his cows a cell phone in hopes to encourage their social interaction. This, however, requires hi

(树形DP) poj 3398

Perfect Service Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1393   Accepted: 679 Description A network is composed of N computers connected by N − 1 communication links such that any two computers can be communicated via a unique rou

POJ 2342 (树形DP)

Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3863   Accepted: 2172 Description There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The University has a hierarchical structure

poj 2342 Anniversary party,树形DP easy

poj 2342 Anniversary party 没有上司的晚会 Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.每个职员有一个快乐指数.现在有个周年庆宴会,要求与会职员的快乐指数最大.但是,没有职员愿和直接上司一起与会. 程序名:party 输入格式: 第一行一个整数N.(1<=N<=6000) 接下来N行,第i+1行表示i号职员的快乐指数Ri.(-128<=Ri<=127) 接下来N-1行,每行输入

POJ 2342 &amp;&amp;HDU 1520 Anniversary party 树形DP 水题

一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加. 要求: 1.为了聚会有趣,若邀请了一个职员,则该职员的直接上级(即父节点)和直接下级(即儿子节点)都不能被邀请 2.每一个员工都有一个兴奋值,在满足1的条件下,要使得邀请来的员工的兴奋值最高 输出最高的兴奋值. 简单的树形DP dp[i][1]:表示以i为根的子树,邀请节点i的最大兴奋值 dp[i][0]:表示以i为根的子树,不邀请节点i的最大兴奋值 先根据入度找出整棵树的根节点, 然后一次DF

POJ 2342 树形DP入门题

有一个大学的庆典晚会,想邀请一些在大学任职的人来参加,每个人有自己的搞笑值,但是现在遇到一个问题就是如果两个人之间有直接的上下级关系,那么他们中只能有一个来参加,求请来一部分人之后,搞笑值的最大是多少. 树形DP入门题. DP部分: dp[i][0]表示职员i不来参加party,以i为根的子树的最大搞笑值, dp[i][1]表示职员i来参加party,以i为根的子树的最大搞笑值. 转移方程: dp[cur][1]+=dp[next][0]; dp[cur][0]+=Max(dp[next][1]

poj 2342(树形DP)

Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6062   Accepted: 3490 Description There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The University has a hierarchical structure