hdu2196 (树的直径)
来源:互联网 发布:javascript 引号 转义 编辑:程序博客网 时间:2024/05/17 21:58
求树上每个点能到达的最远距离,刚开始,就想找到树上最远的两个个点,那么树上的每一个点能到达的最远距离就是到这两个点的距离的大的那一个,(后来发现树上最远的两个个点的距离就叫树的直径)。
写了三个dfs,先求出树上最远的距离,肯定是直径的一个端点,然后再以这端点为根,再跑一次dfs,求出另一个端点,顺便记录到每个点的距离,找出另一个端点,为根跑一遍dfs,记录出另一个端点到每个点的距离,取较大值即可。
不过貌似还有更好的办法,
我的写法:
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N=10005;int s,t,ma,tmp,n;struct node{ int nxt,to,w;}edge[N<<1];int head[N],cnt;int ss[N],tt[N];void add(int u,int v,int w){ edge[++cnt].to=v; edge[cnt].w=w; edge[cnt].nxt=head[u]; head[u]=cnt;}void dfs(int u,int pre,int d){ if(d>ma) { ma=d; tmp=u; } for(int i=head[u];i;i=edge[i].nxt) { int v=edge[i].to; if(v==pre) continue; dfs(v,u,d+edge[i].w); }}void dfs_1(int u,int pre,int d){ if(d>ma) { ma=d; tmp=u; } ss[u]=d; for(int i=head[u];i;i=edge[i].nxt) { int v=edge[i].to; if(v==pre) continue; dfs_1(v,u,d+edge[i].w); }}void dfs_2(int u,int pre,int d){ tt[u]=d; for(int i=head[u];i;i=edge[i].nxt) { int v=edge[i].to; if(v==pre) continue; dfs_2(v,u,d+edge[i].w); }}int main(){ while(~scanf("%d",&n)) { cnt=0; memset(head,0,sizeof(head)); int u,w; for(int i=2;i<=n;i++) scanf("%d%d",&u,&w),add(i,u,w),add(u,i,w); ma=-1; dfs(1,0,0); s=tmp;ma=-1; dfs_1(s,0,0); t=tmp; dfs_2(t,0,0); for(int i=1;i<=n;i++) printf("%d\n",max(ss[i],tt[i])); }}
0 0
- hdu2196(树的直径)
- hdu2196 (树的直径)
- 【树的直径】HDU2196-Computer
- hdu2196 Computer(求树的直径)
- hdu2196 树的直径或者树形dp
- hdu2196-树形dp|树的直径-Computer
- hdu2196 Computer(树的直径||树中的最长路径)
- hdu2196(求树的直径或树形dp)
- HDU2196 Computer(树形dp或树的直径)
- hdu2196 Computer (数的直径的性质)
- bzoj3124 [Sdoi2013]直径 树的直径
- 【树的直径】
- 树的直径
- 求树的直径
- 树的最长直径
- HDU4607 树的直径
- URAL1056(树的直径)
- 树的直径hdu3721
- gdb调试多文件程序
- hibernate3.3.2学习笔记---将图片从本地读到数据库里
- hdu 1394 母函数入门题
- Hibernate(3.6)之初识
- css required,focus,valid和invalid介绍
- hdu2196 (树的直径)
- 软导作业
- MySql sqlstate代码大全
- C#中属性PropertyInfo的使用
- 【openjudge 计算概论(A)】[基础编程练习1]
- 如果一个进程出了问题,怎么判断它是否运行?能不能重启这个进程?尝试使用守护进程来操作
- Codeforces 732C-Sanatorium
- 一串连续奇数,它们的和等于该整数的立方。找出[2,20]之间的数满足这一性质。
- 大整数类的四则运算和逻辑运算