传送门啦

这个树形dp就没那么简单了,运用了一下贪心的思想

不同的排序方法对应着不同的转移方程,如果我们用 $ f[x] = max(f[x] , b[i] +cnt - i + 1) $ 来进行转移就要从小往大排,才能使f[x]小,如果用 $ f[x] = max(f[x] , b[i] + i - 1) $ 来转移就要从大往小排序。

第一个转移方程:$ cnt- i $ 为还有多少个才能到它,然后+1是因为国王这个点信息需要1的时间。即他子树的大小+传递到他的时间+1(向下传递)

第二个转移方程类似。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1005; inline int read(){
char ch = getchar();
int f = 1 , x = 0;
while(ch > '9' || ch < '0'){if(ch == '-')f = -1;ch = getchar();}
while(ch >= '0' && ch <= '9'){x = (x << 1) + (x << 3) + ch - '0';ch = getchar();}
return x * f;
} int n,p;
int head[maxn],tot;
int f[maxn],minn=1e9;
int ans[maxn]; struct Edge{
int to,next;
}edge[maxn << 1]; void add(int u,int v){
edge[++tot].to = v;
edge[tot].next = head[u];
head[u] = tot;
} void dfs(int x,int fa){
int b[550],cnt = 0;
for(int i=head[x];i;i=edge[i].next){
int v = edge[i].to;
if(v != fa){
dfs(v , x);
b[++cnt] = f[v];
}
}
sort(b + 1, b + 1 + cnt );
for(int i=1;i<=cnt;i++)
f[x] = max(f[x] , b[i] + cnt - i + 1);
} int main(){
n = read();
for(int i=2;i<=n;i++){
p = read();
add(i , p);
add(p , i);
}
for(int i=1;i<=n;i++){
memset(f , 0 , sizeof(f));
dfs(i , 0);
minn = min(minn , f[i]);
ans[i] = f[i];
}
printf("%d\n",minn+1);
for(int i=1;i<=n;i++)
if(ans[i] == minn) printf("%d ",i);
return 0;
}

第二个:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1005; inline int read(){
char ch = getchar();
int f = 1 , x = 0;
while(ch > '9' || ch < '0'){if(ch == '-')f = -1;ch = getchar();}
while(ch >= '0' && ch <= '9'){x = (x << 1) + (x << 3) + ch - '0';ch = getchar();}
return x * f;
} int n,p;
int head[maxn],tot;
int f[maxn],minn=1e9;
int ans[maxn]; struct Edge{
int to,next;
}edge[maxn << 1]; void add(int u,int v){
edge[++tot].to = v;
edge[tot].next = head[u];
head[u] = tot;
} bool cmp(int x , int y){
return x > y;
} void dfs(int x,int fa){
int b[550] = {0},cnt = 0;
for(int i=head[x];i;i=edge[i].next){
int v = edge[i].to;
if(v != fa){
dfs(v , x);
b[++cnt] = f[v];
}
}
sort(b + 1, b + 1 + cnt , cmp);
for(int i=1;i<=cnt;i++)
f[x] = max(f[x] , b[i] + i - 1);
f[x] += 1;
} int main(){
n = read();
for(int i=2;i<=n;i++){
p = read();
add(i , p); add(p , i);
}
for(int i=1;i<=n;i++){
memset(f , 0 , sizeof(f));
dfs(i , 0);
minn = min(minn , f[i]);
ans[i] = f[i];
}
printf("%d\n",minn);
for(int i=1;i<=n;i++)
if(ans[i] == minn) printf("%d ",i);
return 0;
}

洛谷P2018消息传递的更多相关文章

  1. 洛谷P2018 消息传递

    P2018 消息传递 题目描述 巴蜀国的社会等级森严,除了国王之外,每个人均有且只有一个直接上级,当然国王没有上级.如果A是B的上级,B是C的上级,那么A就是C的上级.绝对不会出现这样的关系:A是B的 ...

  2. 洛谷——P2018 消息传递

    P2018 消息传递 题目描述 巴蜀国的社会等级森严,除了国王之外,每个人均有且只有一个直接上级,当然国王没有上级.如果A是B的上级,B是C的上级,那么A就是C的上级.绝对不会出现这样的关系:A是B的 ...

  3. 洛谷 P2018 消息传递 题解

    题面 总体来说是一道从下往上的DP+贪心: 设f[i]表示将消息传给i,i的子树全部接收到所能消耗的最小时间: 那么对于i的所有亲儿子节点j,我们会贪心地先给f[j]大的人传递,然后次大..... 可 ...

  4. 洛谷 P2018 消息传递

    题目分析 贪心+树形DP 本来还以为要大费周折地换根,然后发现 \(n\) 很小,可以直接 \(O(n^2\log n)\) 枚举. 枚举每个节点作为根,用 \(f_x\) 表示走完以 \(x\) 为 ...

  5. 洛谷NOIp热身赛题解

    洛谷NOIp热身赛题解 A 最大差值 简单树状数组,维护区间和.区间平方和,方差按照给的公式算就行了 #include<bits/stdc++.h> #define il inline # ...

  6. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  7. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  8. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  9. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

随机推荐

  1. 使用spring cache和ehcache

    一.spring cache Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存放在缓存中,等到下次利用同样的参数来调用该 ...

  2. 利用SHELL的PROMPT_COMMAND添加日志审计功能,实时记录任何用户的操作到日志文件中

    利用 PROMPT_COMMAND 实现命令审计功能:记录什么用户,在什么时间,做了什么操作,然后将查到的信息记录到一个文件里. 具体操作: 将以下内容追加到/etc/profile: ####### ...

  3. 前端如何使用easy-mock模拟接口

    1. 如何使用easy-mock // 获取 easy-mock 的模拟数据 getData () { // 开发环境使用 easy-mock 数据,正式环境使用 json 文件 if (proces ...

  4. List(JDK1.7)(2)

    LinkedList List接口和Deque接口的一种双向链表实现.非同步的. 快速失败机制.ConcurrentModificationException 结点结构 插入结点 删除结点 add() ...

  5. Linux Ubuntu下安装配置mysql

    检查系统中是否已经安装了mysql: sudo netstat -tap | grep mysql 安装mysql: sudo apt-get install mysql-server sudo ap ...

  6. [转载]学习C语言基本思路与参考书籍

    http://zhuanlan.zhihu.com/linjr/19694823 计算机行业发展非常快,大学里的教育基本都跟不上实际的社会需求.如果你所在的学校还在指定大家使用谭浩强的教材,或使用VC ...

  7. js 替换部分内容为星号

    function formatPhone(phone) { return phone.replace(/(\d{3})\d{4}(\d{4})/, "$1****$2"); } 姓 ...

  8. 基于受限玻尔兹曼机(RBM)的协同过滤

    受限玻尔兹曼机是一种生成式随机神经网络(generative stochastic neural network), 详细介绍可见我的博文<受限玻尔兹曼机(RBM)简介>, 本文主要介绍R ...

  9. 20155233 2016-2017-2 《Java程序设计》第6周学习总结

    20155233 2016-2017-2 <Java程序设计>第6周学习总结 学习目标 理解流与IO 理解InputStream/OutPutStream的继承架构 理解Reader/Wr ...

  10. 微服务深入浅出(8)-- 配置中心Spring Cloud Config

    Config Server从本地读取配置文件 将所有的配置文件统一写带Config Server过程的目录下,Config Server暴露Http API接口,Config Client调用Conf ...