给定一棵边权树,求距离每个点最远的点,输出这个距离

#include<bits/stdc++.h>
using namespace std;
#define N 10005
struct Edge{int to,nxt,w;}e[N<<];
int head[N],tot,n;
void init(){memset(head,-,sizeof head);tot=;}
void add(int u,int v,int w){
e[tot].to=v;e[tot].w=w;e[tot].nxt=head[u];head[u]=tot++;
} int d[N];
void dfs1(int u,int pre){
d[u]=;
for(int i=head[u];i!=-;i=e[i].nxt){
int v=e[i].to;
if(v==pre)continue;
dfs1(v,u);
d[u]=max(d[u],d[v]+e[i].w);
}
}
int ans[N];
void dfs2(int u,int pre,int up){
int mx1,mx2,id1,id2;
mx1=mx2=;
id1=id2=;
for(int i=head[u];i!=-;i=e[i].nxt){
int v=e[i].to;
if(v==pre)continue;
if(d[v]+e[i].w>=mx1){
mx2=mx1,id2=id1;
mx1=d[v]+e[i].w,id1=v;
}
else if(d[v]+e[i].w>=mx2)
mx2=d[v]+e[i].w,id2=v;
}
if(up>=mx1){
mx2=mx1,id2=id1;
mx1=up,id1=;
}
else if(up>=mx2)
mx2=up,id2=;
ans[u]=mx1; for(int i=head[u];i!=-;i=e[i].nxt){
int v=e[i].to;
if(v==pre)continue;
if(v==id1)
dfs2(v,u,mx2+e[i].w);
else
dfs2(v,u,mx1+e[i].w);
} } int main(){
while(cin>>n){
init();
for(int i=;i<=n;i++){
int v,w;
scanf("%d%d",&v,&w);
add(i,v,w);add(v,i,w);
} dfs1(,); dfs2(,,); for(int i=;i<=n;i++)cout<<ans[i]<<endl;
}
}
/*
7
1 10
1 20
2 2
2 1
3 1
3 100
*/

最新文章

  1. 二.TimesTen原理及应用场景
  2. 关于java中的异常问题 1
  3. 倍增法-lca codevs 1036 商务旅行
  4. Java for LeetCode 034 Search for a Range
  5. POJ 3522 Slim Span 最小生成树,暴力 难度:0
  6. Is Fibo
  7. 又优化了一下 Android ListView 异步加载图片
  8. Chrome 常用快捷键
  9. PHP文本的读写
  10. xtream 示例介绍
  11. Formatting the event object
  12. java并发包小结(一)
  13. mysql导出表的字段及相关属性
  14. 创建Gitblit本地服务器(For windows )01
  15. UIScrollView嵌套的完美解决方案
  16. JS 在页面上直接将json数据导出到excel,支持chrome,edge,IE10+,IE9,IE8,Safari,Firefox
  17. CentOS系统安装遇到的一些问题
  18. c++ 日志输出库 spdlog 简介(4)- 多线程txt输出日志
  19. 牛顿迭代法(Newton's Method)
  20. PreparedStatement 使用like 模糊查询

热门文章

  1. C# 利用发射动态创建泛型类型的对象,泛型类型支持带惨的构造函数
  2. nginx获取头部信息带下划线,获取不到解决方案
  3. leetcode-160周赛-5239-循环码排列
  4. SQL Select选择
  5. Ext OOP基础
  6. Spring源码剖析4:懒加载的单例Bean获取过程分析
  7. mac下nginx
  8. img标签+map的使用
  9. Ubuntu下设置静态网址
  10. CentOS 7 启用中文输入法