经典换根dp——hdu2196
2024-08-26 15:08:40
给定一棵边权树,求距离每个点最远的点,输出这个距离
#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
*/
最新文章
- 二.TimesTen原理及应用场景
- 关于java中的异常问题 1
- 倍增法-lca codevs 1036 商务旅行
- Java for LeetCode 034 Search for a Range
- POJ 3522 Slim Span 最小生成树,暴力 难度:0
- Is Fibo
- 又优化了一下 Android ListView 异步加载图片
- Chrome 常用快捷键
- PHP文本的读写
- xtream 示例介绍
- Formatting the event object
- java并发包小结(一)
- mysql导出表的字段及相关属性
- 创建Gitblit本地服务器(For windows )01
- UIScrollView嵌套的完美解决方案
- JS 在页面上直接将json数据导出到excel,支持chrome,edge,IE10+,IE9,IE8,Safari,Firefox
- CentOS系统安装遇到的一些问题
- c++ 日志输出库 spdlog 简介(4)- 多线程txt输出日志
- 牛顿迭代法(Newton's Method)
- PreparedStatement 使用like 模糊查询