博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj1985 求树的直径
阅读量:6578 次
发布时间:2019-06-24

本文共 1410 字,大约阅读时间需要 4 分钟。

http://poj.org/problem?id=1985

当初在刘书看过树上最远对,但是依稀记得是dp,而直径是双dfs好像没关系。

今天终于搞懂了,是双dfs的dp

第一遍dfs产生树形图,f,g分别记录i点只考虑到子树内的叶子的最远距离,次远距离

第二遍dfs利用f和g计算出h,表示i点“上面”的子树内的叶子的最远距离,之所以次远也要是因为可能最远的在子树内不在“上面”。

这里有一个问题,dp是有阶段性的,怎么保证计算h的时候需要的数据都已经计算好了?dfs先dfs再更新,保证子点先算玩,dfs1先更新再dfs1,保证父点先算玩。

#include
#include
#include
#include
#include
#include
using namespace std;#define maxn 40005#define For(i,k,n) for(int i=k;i<=n;i++)#define ForD(i,k,n) for(int i=n;i>=k;i--)#define Lson (x<<1)#define Rson ((x<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define NEG(a) memset(a,-1,sizeof(a));#define FILL(a) memset(a,0x3f,sizeof(a));#define fp freopen("in.txt","r",stdin)struct edge{ int v, w;};int N,M;int f[maxn],g[maxn],h[maxn],longest[maxn];vector
e[maxn];void init(){ For(i,1,N) e[i].clear(); NEG(f);NEG(g);NEG(h);NEG(longest);}int dfs(int root, int pre){ int est = 0, esti=-1, er=0; if(f[root]!=-1) return f[root]; if(e[root].empty()) { //printf("root=%d\n",root); return f[root] = 0; } for(int i=0;i
est){ est = f[e[root][i].v]+e[root][i].w; esti = i; } } } longest[root] = esti; for(int i=0;i
er&&i!=longest[root]){ er = f[e[root][i].v]+e[root][i].w; } } } g[root] = er; return f[root] = est;}void dfs1(int root, int pre){ for(int i=0;i
View Code

 

转载于:https://www.cnblogs.com/diang/p/5733447.html

你可能感兴趣的文章
poj1985 求树的直径
查看>>
Python PyPI中国镜像
查看>>
centos 设置静态IP
查看>>
[Angularjs]系列——学习与实践
查看>>
js -- canvas img 封装
查看>>
转 我们工作的动力是什么 工作最终是为了什么?
查看>>
测试一个网站的最大并发量并发数并发用户
查看>>
适配器模式(数据库方面)支持不同的数据库连接
查看>>
CF456B Fedya and Maths 找规律
查看>>
nodejs安装及windows环境配置
查看>>
转载:Beginning WF 4.0翻译——第三章(流程图工作流)
查看>>
mysql alter table
查看>>
芯片测试
查看>>
在源代码中插入防止盗版代码片段的方式
查看>>
hdu 3367 Pseudoforest(最大生成树)
查看>>
一个人,一则故事,一份情愫,一个世界……
查看>>
ffserver联合ffmpeg建立媒体服务器
查看>>
下载稻草人下来刷新+gallery
查看>>
删除浏览器浏览器删除cookie方法
查看>>
微软URLRewriter.dll的url重写的简单使用(实现伪静态)
查看>>