非常妙的树形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. python的阶段复习

    1.ABCD乘于9 = DCBA,求ABCD的值,且ABCD均互不相等 #!/usr/bin/env python # -*- coding:utf-8 -*- # @Time :2017/12/26 ...

  2. (转) 在Windows 下安装drush

    原帖地址:http://www.drupalla.com/node/2263 Drush是一个在命令行使用的php脚本库,在服务器本地通过php解释器调用执行,可以用命令行操作的形式管理Drupal站 ...

  3. Use GitHub Desktop to get GitHub projects

    Find the project's https git file in the home page of the project. e.g. https://github.com/PrismLibr ...

  4. python3 爬虫爬取深圳公租房轮候库(深圳房网)

    深圳公租房轮候库已经朝着几十万人的规模前进了,这是截至16年10月之前的数据了,贴上来大家体会下 所以17年已更新妥妥的10W+ 今天就拿这个作为爬虫的练手项目 1.环境准备: 操作系统:win10 ...

  5. 阿里云ECS下CentOS7.4 yum安装Python3.6环境

    一.安装EPEL和IUS软件源 二.安装Python3.6 三.创建python3软链接连接符 四.安装pip3 五.创建pip3链接符 六.进行验证是否安装成功 一.安装EPEL和IUS软件源 yu ...

  6. python操作符及其循环语句(非常全)

    //2018.10.14 1. Windows + R可以直接进行运行cmd 2. Random.randint(a,b):产生a-b的任意一个整数,在IDLE里面运行时需要注意在前面写好调用impo ...

  7. servlet和Jsp的复习整理

    servlet 1.生命周期 a.构造方法.生成一个servlet b.init()方法.当开启服务器时,servlet第一次被装载,servlet引擎调用这个servlet的init()的方法,只调 ...

  8. 垃圾收集器与内存分配策略(深入理解Java虚拟机)

    3.1 概述 垃圾收集器要解决哪些问题? 哪些内存需要回收 什么时候回收 如何回收 引用计数算法:当有一个地方引用,+1,引用失效,-1.     缺点:对象之间相互循环引用的问题. 可达性分析算法: ...

  9. 实现Bidirectional LSTM Classifier----深度学习RNN

    双向循环神经网络(Bidirectional Recurrent Neural Networks,Bi-RNN),Schuster.Paliwal,1997年首次提出,和LSTM同年.Bi-RNN,增 ...

  10. 您的下个中文网站可以使用的5个高质量中文Webfont

    你有没有考虑为什么中文网站的版式风格不像大多数现代英文网站那样丰富?您想了解如何让您的下一个中文网站项目更吸引用户的眼球么?继续往下读吧…… 根据Smashing Magazine进行的一项调查显示  ...