HDU 2196 Computer(树形dp)
来源:互联网 发布:鬼谷尸踪 有声小说软件 编辑:程序博客网 时间:2024/05/16 18:29
dp1表示i结点的子树的最长距离,dp2表示i结点的子树的次长距离,dp3表示i结点通过父节点再到父节点的另一颗子树的最长距离,maxd表示i的最长路径的下一个结点.
首先进行一次从叶结点到根的dfs,求出各个点的子树的最长距离和次长距离
然后再进行一次从根节点到叶结点的dfs,求出每个结点通过其父节点的能够得到的最大距离:
1.设当前点为u,当maxd[u]等于儿子结点v的时候,说明v在u的最长路径上,那么必须要用到次长距离了,dp3[v]=max(dp3[u],dp2[u])+w
2.否则说明v不在u的最长路径上,那么用最长距离就可以了,dp3[v]=max(dp3[u],dp1[u])+w
最后每个结点i的最长距离就是max(i的子树的最长距离,i通过父节点再到父节点的另一颗子树的最长距离)
#include <iostream> #include <cstdio> #include <queue> #include <memory.h> using namespace std; #define MS(a) memset(a,0,sizeof(a)) const int maxn=10010; int head[maxn],dp1[maxn],dp2[maxn],dp3[maxn],maxd[maxn],n; bool vis[maxn]; struct edge{ int v,w,next; }es[maxn*2]; void addedge(int u,int v,int w,int eidx){ es[eidx].v=v; es[eidx].w=w; es[eidx].next=head[u]; head[u]=eidx; } void dfs1(int u,int fa){ for (int ne=head[u];ne;ne=es[ne].next){//最大路径和次大路径初始化为0,如果u的儿子个数大于1那么就会有次大路径产生,否则也不会产生影响. int v=es[ne].v,w=es[ne].w; if(v==fa)continue; dfs1(v,u); if(dp1[v]+w>dp1[u]){ maxd[u]=v; dp2[u]=dp1[u]; dp1[u]=dp1[v]+w; }else if(dp1[v]+w>dp2[u]){ dp2[u]=dp1[v]+w; } } } void dfs2(int u,int fa){ for (int ne=head[u];ne;ne=es[ne].next){ int v=es[ne].v,w=es[ne].w; if(v==fa)continue; if(maxd[u]==v){//v在u的最大路径上 dp3[v]=max(dp3[u],dp2[u])+w;//取u的当前值和u的次大值中的最大值 }else{ dp3[v]=max(dp1[u],dp3[u])+w;//取u的当前值和u的最大值中的最大值 } dfs2(v,u); } } int main(){ while (scanf("%d",&n)==1){ MS(dp1),MS(dp2),MS(head),MS(maxd),MS(dp3); int eidx=1,f=0; for (int i=2;i<=n;++i){ int v,w; scanf("%d%d",&v,&w); addedge(i,v,w,eidx++),addedge(v,i,w,eidx++); } dfs1(8,0); dfs2(8,0); for (int i=1;i<=n;++i){ printf("%d\n",max(dp1[i],dp3[i]));//取i的子树最长路径和i到父节点再到父节点的另外子树的最长路径中的最大值 } } return 0; }
- HDU 2196 Computer(树形dp)
- 【树形DP】 HDU 2196 Computer
- HDU 2196 Computer(树形DP)
- Hdu 2196 Computer(树形dp)
- Computer - HDU 2196 树形dp
- Hdu 2196 Computer (树形dp)
- HDU 2196 Computer | 树形dp
- 【树形DP】 HDU 2196 Computer
- HDU 2196 Computer (树形DP)
- hdu 2196 Computer (树形dp)
- *HDU 2196 - Computer(树形DP)
- [HDU 2196] Computer 树形dp
- HDU 2196Computer 树形dp
- 【hdu】2196 Computer【树形dp】
- HDU 2196 Computer [树形dp]
- hdu 2196 Computer(树形DP)
- 树形DP-HDU-2196-Computer
- 【HDU】2196 Computer 树形dp
- php设计模式--工厂模式Factory
- 如何做一款成功的应用(上)
- java中的IO大全
- Java相对路径/绝对路径总结(转)
- linux对外开放端口
- HDU 2196 Computer(树形dp)
- php 中init log
- JavaScript中的匿名函数及函数的闭包
- ScrollView 置顶效果
- java内存模型
- 你还在用QPushButton吗?
- 强大的grep
- IO流的文件写入与读取
- 测试图片