题意:给出一棵树,求出每个点与距离它最远的点的距离。

/*
树形DP
先把无根树转为有根树,对于一个节点i来说,与它相距最远的点有两种可能,一是在它的子树中,二是不在,我们分别用f[i][0]和f[i][1]来表示。
f[i][0]很好求,从子节点向它的父亲递推就可以了。
关键在于求f[i][1],我们发现f[i][1]可能有两种情况,一是来自它父亲的子树,而是来自它父亲的f[j][1],然后判断一下就好了。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 10010
#define lon long long
using namespace std;
int head[N],vis[N],n,cnt;
lon f[N][];
struct node{int v,w,pre;}e[N*];
void add(int u,int v,int w){
e[++cnt].v=v;e[cnt].w=w;e[cnt].pre=head[u];head[u]=cnt;
e[++cnt].v=u;e[cnt].w=w;e[cnt].pre=head[v];head[v]=cnt;
}
lon dfs1(int u){
vis[u]=;
for(int i=head[u];i;i=e[i].pre){
if(vis[e[i].v]) continue;
f[u][]=max(f[u][],dfs1(e[i].v)+e[i].w);
}
return f[u][];
}
void dfs2(int u){
vis[u]=;
lon max1=,max2=;int v1,v2;
for(int i=head[u];i;i=e[i].pre){
int v=e[i].v,w=e[i].w;
if(vis[v]) continue;
if(f[v][]+w>max1){
max2=max1;v2=v1;
max1=f[v][]+w;v1=v;
}
else if(f[v][]+w>max2){
max2=f[v][]+w;v2=v;
}
}
if(u!=){
if(f[u][]>max1){
max2=max1;v2=v1;
max1=f[u][];v1=-;
}
else if(f[u][]>max2){
max2=f[u][];v2=-;
}
}
for(int i=head[u];i;i=e[i].pre){
int v=e[i].v;
if(vis[v]) continue;
if(v1!=v) f[v][]=max1+e[i].w;
else f[v][]=max2+e[i].w;
dfs2(e[i].v);
}
}
void work(){
for(int u=;u<=n;u++){
int v,w;scanf("%d%d",&v,&w);
add(u,v,w);
}
memset(vis,,sizeof(vis));
dfs1();
memset(vis,,sizeof(vis));
dfs2();
for(int i=;i<=n;i++)
cout<<max(f[i][],f[i][])<<endl;
}
int main(){
freopen("jh.in","r",stdin);
while(scanf("%d",&n)!=EOF){
memset(head,,sizeof(head));
memset(f,,sizeof(f));
cnt=;
work();
}
return ;
}

最新文章

  1. MVC利用MvcHtmlString在后台生成HTML
  2. PHP 缓存扩展opcache
  3. mysql学习-windows下绿色版mysql安装问题解决办法
  4. QT在windows下实现截屏操作并保存为png图片
  5. php学习笔记:读取文档的内容,利用php修改文档内容
  6. 在实体注解OneToMany时,要加上mappedby,避免产生中间表。
  7. (原创)openvswitch实验连载1-fedora 17下安装openvswitch
  8. Android 颜色配置表-颜色类
  9. 使用WebBrowser,内存一直增加的解决办法
  10. 长轮询实现Chat并迁移到Azure测试
  11. OAuth 2.0 / RCF6749 协议解读
  12. awk grep sed cut学习
  13. setBit testBit权限管理(shiro项目中来的二)
  14. Spark安装部署| 运行模式
  15. 表单数据转javabean对象
  16. C#将时间转化自定义类型格式,C#获取时间间隔
  17. 「PKUWC 2018」Minimax
  18. javaBean转为json
  19. 51Nod 1084:矩阵取数问题 V2(多维DP)
  20. 使用PeopleSoft 异步操作设置步骤

热门文章

  1. windows下的node.js和npm的安装步骤详解
  2. JavaSE 第二次学习随笔(一)
  3. Gson转Map时,Int会变成double解决方法
  4. kivy学习二:做一个查询所在地区身份证前6位的小软件
  5. HDU 3364 高斯消元
  6. 让菜鸡讲一讲网络流(isap)
  7. 《Cracking the Coding Interview》——第1章:数组和字符串——题目8
  8. Pascal小游戏 俄罗斯方块
  9. python 3 使用cmp函数报错
  10. Linux认知之旅【06 图形界面上的各种折腾】!