HDU - 1520 Anniversary party (树的最大独立集)
Time limit :1000 ms ;Memory limit :32768 kB; OS :Windows
There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The University has a hierarchical structure of employees. It means that the supervisor relation forms a tree rooted at the rector V. E. Tretyakov. In order to make the party funny for every one, the rector does not want both an employee and his or her immediate supervisor to be present. The personnel office has evaluated conviviality of each employee, so everyone has some number (rating) attached to him or her. Your task is to make a list of guests with the maximal possible sum of guests' conviviality ratings.
Input
Employees are numbered from 1 to N. A first line of input contains a number N. 1 <= N <= 6 000. Each of the subsequent N lines contains the conviviality rating of the corresponding employee. Conviviality rating is an integer number in a range from -128 to 127. After that go T lines that describe a supervisor relation tree. Each line of the tree specification has the form:
L K
It means that the K-th employee is an immediate supervisor of the L-th employee. Input is ended with the line
0 0
Output
Output should contain the maximal sum of guests' ratings.
Sample Input
7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0
Sample Output
5
题意:给你一棵树,你从中选择若干结点,要求这些结点中任意两个不能有“父子”关系,求最后权值的最大值。
分析:这便是紫书上所说的“树的最大独立集”问题,这要是放在线性表上,直接用01背包就解决了,但树上的动态规划就是把这种简单操作放在树上解决,难度就增加了。解题步骤如下:
①用邻接表储存所给的树。
②因为每个点可取可不取,dp[i][0]表示第i个结点不选时的最大值,dp[i][1]表示第i个结点选时的最大值。状态转移方程为: dp[father][0] += max(dp[son][0],dp[son][1]);父亲没有被邀请 ,dp[father][1] += dp[son][0];父亲被邀请了,儿子不能被邀请。
③最终结果为max(dp[root][1],dp[root][0])。
AC代码如下(93ms):
#include <bits/stdc++.h>
using namespace std;
#define fast ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define ll long long
#define _for(i,a,b) for(int i = a;i < b;i++)
#define rep(i,a,b) for(int i = a;i <= b;i++)
#define all(s) s.begin(), s.end()
const int maxn = 6050;
int N;
bool no_root[maxn];//判断是不是树根
vector<int>G[maxn];//邻接表
int dp[maxn][2];//dp[i][0]表示以i为根的子树,不选i时的最大值
//dp[i][1]表示以i为根的子树,选i时的最大值
void dfs(int root)
{
int nson = G[root].size();
_for(i, 0, nson)
{
int son = G[root][i];
dfs(son);
dp[root][0] += max(dp[son][1], dp[son][0]);
dp[root][1] += dp[son][0];
}
}
int main()
{
while (scanf("%d", &N) == 1)
{
memset(no_root, 0, sizeof(no_root));
rep(i, 1, N)G[i].clear();//清空邻接表
rep(i, 1, N)
{
scanf("%d", &dp[i][1]);
dp[i][0] = 0;
}
int v, u;//员工与直属上级
while (scanf("%d%d", &v, &u) == 2 && v + u)//u是v的父结点
{
G[u].push_back(v);
no_root[v] = true;//v不是根
}
int ans = 0;
rep(i, 1, N)
{
if (no_root[i] == 0)//从根结点开始(注意,这里可能不止一个根)
{
dfs(i);
ans = max(ans, max(dp[i][0], dp[i][1]));
}
}
printf("%d\n", ans);
}
return 0;
}
HDU - 1520 Anniversary party (树的最大独立集)的更多相关文章
- POJ 2342 Anniversary party / HDU 1520 Anniversary party / URAL 1039 Anniversary party(树型动态规划)
POJ 2342 Anniversary party / HDU 1520 Anniversary party / URAL 1039 Anniversary party(树型动态规划) Descri ...
- hdu 1520 Anniversary party(第一道树形dp)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Time Limit: 2000/1000 MS (Java ...
- 题解报告:hdu 1520 Anniversary party(树形dp入门)
Problem Description There is going to be a party to celebrate the 80-th Anniversary of the Ural Stat ...
- hdu 1520 Anniversary party 基础树dp
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- HDU 1520.Anniversary party 基础的树形dp
Anniversary party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题
一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加. 要求: 1.为了聚会有趣,若邀请了一个职员,则该职员的直接上级(即父节点)和直接下级(即儿子节点) ...
- HDU 1520 Anniversary party [树形DP]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题目大意:给出n个带权点,他们的关系可以构成一棵树,问从中选出若干个不相邻的点可能得到的最大值为 ...
- hdu 1520 Anniversary party || codevs 1380 树形dp
Anniversary party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- [HDU 1520] Anniversary party
Anniversary party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
随机推荐
- WeChair项目Alpha冲刺(4/10)
团队项目进行情况 1.昨日进展 Alpha冲刺第四天 昨日进展: 前端完成小程序登录态的定义 LoginController编写初步完成同时修改并更新了代码,但是在将编码好的项目部署到服务器上时 ...
- WIN7系统安装photoshop CS6出现配置错误:16的解决方法
- 关于 urlencode 的使用和 json 模块的介绍
先附上一段 “百度翻译” 的爬虫代码 # python爬虫实现百度翻译 # urllib和request POST参数提交 from urllib import request,parse impor ...
- 【状压dp】Bzoj1294 围豆豆
题目 Input 第一行两个整数N和M,为矩阵的边长. 第二行一个整数D,为豆子的总个数. 第三行包含D个整数V1到VD,分别为每颗豆子的分值. 接着N行有一个N×M的字符矩阵来描述游戏矩阵状态,0表 ...
- selenium(12)-web UI自动化项目实战(PO模式,代码封装)
web UI自动化项目实战-项目 项目使用禅道,所以你需要搭建1个禅道,搭建禅道的方法和步骤见 https://www.cnblogs.com/xinhua19/p/13151296.html 搭建U ...
- 洛谷 P1194 【买礼物】
这道题其实就是转化一个模型就可以了. 买了一个另外一个又优惠,其实就相当于在优惠的时候连一条边,因为不可能多买,所以就是建一棵最小生成树.最后因为肯定买了一件物品,要加上最初的单价. 代码: #inc ...
- C++ ACE 动态加载链接库
添加头文件 #include <ace/DLL.h> #include <ace/DLL_Manager.h> 定义函数接口 typedef long (*PFN_TEST)( ...
- windows10 通过vnc远程访问ubuntu16.04
参考链接 链接1 , 链接2 ,链接3 . 0.前言: 为方便深度学习训练,我们需要多个windows的电脑可以远程访问一个linux系统的工作站(以方便在linux系统上进行深度学习训练) 前提: ...
- WireGuard 教程:WireGuard 的工作原理
原文链接:https://fuckcloudnative.io/posts/wireguard-docs-theory/ WireGuard 是由 Jason Donenfeld 等人用 C 语言编写 ...
- MySQL实验 内连接优化order by+limit 以及添加索引再次改进
MySQL实验 内连接优化order by+limit 以及添加索引再次改进 在进行子查询优化双参数limit时我萌生了测试更加符合实际生产需要的ORDER BY + LIMIT的想法,或许我们也可以 ...