非常妙的树形DP:由于n很小,我们可以枚举每一个点作为第一个节点,计算其时间花费

那么问题就转化为对于给点节点求花费时间。

通过观察,显然我们会发现先传给花费时间多的人更加合算,因为这样可以最大限度的避免

一个人还在辛苦的传递信息,另一个人却悠闲的喝下午茶(雾)的局面

所以我们可以每次都记录下对于一个节点而言,它的所有子节点的时长,

并对其排序,排序后先传给耗时最多的人,但这样传递了之后,由于耗时最多的人最先被传递,

那么这个本应耗时最多的人就不一定还是耗时最多的人了,因此我们要分别计算所有子节点

的耗时,并取max计入ans,最后dp数组即代表一旦这个节点得知消息,要多久才可以把消息传给 所有其他的人(除了传给它的那个人),即完成任务。树的结构保证了其正确性

why是ans=min(son[i]+cnt-i+1)?

因为这里为了方便是从小到大排序,又因为是优先大的

cnt-i即为还有多少个才能到它,然后+1是因为高斯这个点信息需要1的时间。

son[i]则是加上自身的时间

 #include<bits/stdc++.h>
using namespace std;
#define AC 1100
#define ACway 2500
#define R register int
#define D printf("line in %d\n",__LINE__);
int n;
int Head[AC],Next[ACway],date[ACway],tot;
int ans[AC],minn=INT_MAX,f[AC];//use用来存储每个节点的儿子(DFS中临时存储)
inline int read()
{
int x=;char c;
while(isspace(c=getchar()));
while(c>='' && c<='')x=x*+c-'',c=getchar();
return x;
} inline void add(int f,int w)
{
date[++tot]=w , Next[tot]=Head[f] , Head[f]=tot;
date[++tot]=f , Next[tot]=Head[w] , Head[w]=tot;
} void upmax(int &a,int b)
{
if(b>a)a=b;
} void upmin(int &a,int b)
{
if(b<a)a=b;
} void DFS(int x,int fa)
{
R now;
int cnt=,son[AC];//开在DFS里面更加方便?
for(R i=Head[x]; i ;i=Next[i])//枚举子节点
{
now=date[i];
if(now!=fa)//如果不是父亲,即为儿子
{
DFS(now,x);
son[++cnt]=f[now];
}
}
sort(son+,son+cnt+);
for(R i=;i<=cnt;i++) upmax(f[x],son[i]+cnt-i+);
} void pre()
{
R a;
n=read();
for(R i=;i<=n;i++)
{
a=read();//读入i的上级
add(a,i);
}
} void work()
{
for(R i=;i<n;i++)//枚举第一个节点
{
memset(f,,sizeof(f));
DFS(i,);
ans[i]=f[i];//ans[i]存以i为第一个节点的最小耗时
upmin(minn,ans[i]);
}
printf("%d\n",minn+);//还包括告诉别人的时间
for(R i=;i<=n;i++)
if(ans[i]==minn) printf("%d ",i);
} int main()
{
// freopen("in.in","r",stdin);
pre();
work();
// fclose(stdin);
return ;
}

消息传递 树形DP的更多相关文章

  1. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  2. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  3. 【BZOJ-4726】Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  4. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

  5. 树形DP

    切题ing!!!!! HDU  2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...

  6. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...

  7. POJ2342 树形dp

    原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...

  8. hdu1561 The more, The Better (树形dp+背包)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...

  9. bzoj2500: 幸福的道路(树形dp+单调队列)

    好题.. 先找出每个节点的树上最长路 由树形DP完成 节点x,设其最长路的子节点为y 对于y的最长路,有向上和向下两种情况: down:y向子节点的最长路g[y][0] up:x的次长路的g[x][1 ...

随机推荐

  1. VINS(六)边缘化

    通常的边缘化是将联合概率分布分解为边缘概率分布和条件概率分布的过程,这样可以将Sliding Window中较旧的状态边缘化出Sliding Window,同时保留其信息.并且保证了对应H海塞矩阵的稀 ...

  2. 图片文件转换成Base64编码实现ajax提交图片

    //上传头像图片 function uploadHead(imgPath) { console.log("imgPath = " + imgPath); var image = n ...

  3. PostFix支持SMTP认证

    安装cyrus-sasl yum -y install cyrus-sasl* 启动服务,开机启动 service saslauthd start chkconfig saslauthd on 配置p ...

  4. 【第五章】MySQL数据库的安全机制

    MySQL权限表MySQL用户管理MySQL权限管理SSL加密连接

  5. centos+nginx+redmine+gitosis安装指南

    说明 这篇文章我现在的主要目的是记录自己安装redmine和gitosis的过程,可能写的有些糙,请各位读者见谅.我会在后面的时间里逐渐完善细节.但我想,这已经是网上迄今为止国内最详细的nginx+r ...

  6. ZOJ 3689 Digging(DP)

    Description When it comes to the Maya Civilization, we can quickly remind of a term called the end o ...

  7. js经典试题之运算符的优先级

    js经典试题之运算符 1.假设val已经声明,可定义为任何值.则下面js代码有可能输出的结果为: console.log('Value is ' + (val != '0') ? 'define' : ...

  8. 安装Tensorflow过程pip安装报错:is not a supported wheel on this platform

    安装Tensorflow过程pip安装报错:is not a supported wheel on this platform 通过pip安装wheel镜像时,安装指令为: pip install - ...

  9. 什么是Processing

    Processing是一种计算机语言,以JAVA语法为基础,可转化成JAVA程序,不过在语法上简易许多.所有的原始代码及开发环境开放,主要用于艺术.影像.影音的设计与处理. 其次为什么要介绍这款软件呢 ...

  10. [zt]手把手教你写对拍程序(PASCAL)

    谁适合看这篇文章? ACMERS,OIERS或其它参加算法竞赛或需要算法的人 对操作系统并不太熟悉的人 不会写对拍的人 在网上找不到一个特别详细的对拍样例的人 不嫌弃我写的太低幼的人 前言 在NOIP ...