HDU 1520 Anniversary party
2015-10-08 16:08
204 查看
题意:n个人去参加聚会,其中有直接上下级关系的参加聚会会影响气氛,所以不能参加,每个人参加聚会都会有一个活跃度,现在要你计算从n个人中选择出一些人,使得本次聚会的活跃度最大
输入数据:
第一行一个N代表有N个人,然后是N个人每个人的活跃度。
然后再N-1行, 每行两个数字,L K 代表 第K个员工是第L个人的上司。
输入数据:
第一行一个N代表有N个人,然后是N个人每个人的活跃度。
然后再N-1行, 每行两个数字,L K 代表 第K个员工是第L个人的上司。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> #include<queue> #include<vector> #include<map> using namespace std; typedef long long LL; const int INF = 1e9+7; const int maxn = 6010; const int MOD = 1e9+7; int n, dp[2][maxn], In[maxn];///dp[这个点是否选取][第n个点] vector<vector<int> > G; void TreeDp(int root) { int len = G[root].size(); for(int i=0; i<len; i++) { int v = G[root][i]; TreeDp(v); dp[0][root] += max(dp[0][v],dp[1][v]); dp[1][root] += dp[0][v]; } } int main() { int a, b; while(scanf("%d", &n) != EOF) { G.clear(); G.resize(n+5); memset(dp, 0, sizeof(dp)); memset(In, 0, sizeof(In)); for(int i=1; i<=n; i++) scanf("%d", &dp[1][i]); while(scanf("%d %d", &a, &b), a+b) { G[b].push_back(a); In[a] ++; } int root; for(int i=1; i<=n; i++) if(!In[i]) root = i; TreeDp(root); printf("%d\n", max(dp[0][root],dp[1][root])); } return 0; }
相关文章推荐
- Web项目添加接口响应时长
- 高通APQ8074 spi 接口配置
- Grape-demo1
- sql优化之:count(distinct xxxx)
- 时空权限的表
- JavaScript 面向对象详解
- 高通APQ8074 spi 接口配置
- reactor和proactor的区别
- 如何测试网页的登录页面
- poj 3278
- java学习——架构的设计是项目的核心
- jQuery Mobile 高级设计模板
- 使用jquery获取ul的li的值赋值
- IIS HTTPS 禁用不安全的SSL2.0
- Cassandra 数据库设计
- jquery自动创建表格
- ubuntu个目录作用
- 带环的链表
- 和为S的两个数字与退出双层循环
- 功能性测试之边界值测试