传送门啦

这个树形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. LGP4518[JSOI2018]绝地反击

    题解: 只要确定了每艘飞船的就位位置,就可以用二分+网络流求得答案: 定义偏转角度$a$为离$x$正半轴逆时针最近的边的弧度,$a \in [0,\frac{2\pi}{n})$ 二分一个值,对于一个 ...

  2. (转)教你完全理解IO流里的 read(),read(byte[]),read(byte[],int off,int len)以及write

    背景:对于IO部分,总是感觉很虚,不能很好的理解其中的要义,其实仔细分析,掌握其中的规律,一切都会看起来十分的自然. 1 理解 1.1 从头总结 长期以来,java中的InputStream Outp ...

  3. RadioButton如何隐藏和替换

    http://q.cnblogs.com/q/60738/ 用Jquery写的,可以实现隐藏功能,代码如下: 1 <%@ Page Language="C#" AutoEve ...

  4. BP神经网络人口预测程序(matlab实现)

    自己测试人口预测的matlab实现: x=[54167    55196    56300    57482    58796    60266    61465    62828    64653  ...

  5. HOJ 13101 The Triangle Division of the Convex Polygon(数论求卡特兰数(模不为素数))

    The Triangle Division of the Convex Polygon 题意:求 n 凸多边形可以有多少种方法分解成不相交的三角形,最后值模 m. 思路:卡特兰数的例子,只是模 m 让 ...

  6. scrum敏捷开发重点介绍

    参考: http://www.scrumcn.com/agile/scrum-knowledge-library/scrum.html https://www.zhihu.com/question/3 ...

  7. HashMap源码分析-基于JDK1.8

    hashMap数据结构 类注释 HashMap的几个重要的字段 hash和tableSizeFor方法 HashMap的数据结构 由上图可知,HashMap的基本数据结构是数组和单向链表或红黑树. 以 ...

  8. 解除单个文件的与svn服务器的关联

    有些文件和个人开发环境有关不需要和svn服务器做同步,可以取消其和svn服务的关联. 右键选中要取消关联的文件,右键菜单 Tortoise SVN  --->   unversion and a ...

  9. Redis学习二:Redis入门介绍

    一.入门概述 1.是什么 Redis:REmote DIctionary Server(远程字典服务器) 是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内 ...

  10. psutil-3.4.2才是我的老系统(Windows XP)的菜

    psutil-3.4.2才是我的老系统(Windows XP)的菜 psutil 是一款跨平台的查看操作系统和进程信息的工具. 在一次卸载和重装了spyder包之后, spyder升级到了: 2.3. ...