博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[hdu2196]Computer树的直径
阅读量:5013 次
发布时间:2019-06-12

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

题意:求树中距离每个节点的最大距离。

解题关键:两次dfs,第一次从下向上dp求出每个节点子树中距离其的最大距离和不在经过最大距离上的子节点上的次大距离(后序遍历),第二次从上而下dp求出其从父节点过来的最大距离(先序遍历).

如果vi不是u最长距离经过的节点,$d[{v_i}][2] = dist[{v_i}][u] + \max (d[u][0],d[u][2])$;

如果vi是u最长距离经过的节点,$d[{v_i}][2] = dist[{v_i}][u] + \max (d[u][1],d[u][2]);$

最终答案即是从下而来和从上而来的距离的最大值。

 取最大值和次大值时的>=和>是无所谓的,都可以过

1 #include
2 using namespace std; 3 typedef long long ll; 4 const int maxn=1e5+2; 5 int head[maxn],tot,d[maxn][3],longest[maxn]; 6 struct edge{ 7 int to; 8 int nxt; 9 int w;10 }e[maxn<<1];11 void add_edge(int u,int v,int w){12 e[tot].to=v;13 e[tot].w=w;14 e[tot].nxt=head[u];15 head[u]=tot++;16 }17 18 int dfs1(int u,int fa){
//返回子树最大距离 19 for(int i=head[u];i!=-1;i=e[i].nxt){20 int v=e[i].to;21 if(v==fa) continue;22 int tmp=dfs1(v,u);23 if(d[u][0]
>n){51 tot=0;52 memset(d,0,sizeof d);53 memset(head,-1,sizeof head);54 memset(longest,0,sizeof longest);55 int a,b;56 for(int i=2;i<=n;i++){57 cin>>a>>b;58 add_edge(i,a,b);59 add_edge(a,i,b);60 }61 dfs1(1,-1);62 dfs2(1,-1);63 for(int i=1;i<=n;i++){64 cout<
<<"\n";65 }66 }67 return 0;68 }

 最优写法:

不需要记录longest,只要d[v][0]+e[i].w==d[u][0],此时即可取次大距离。

1 #include
2 using namespace std; 3 typedef long long ll; 4 const int maxn=1e5+2; 5 int head[maxn],tot,d[maxn][3]; 6 struct edge{ 7 int to; 8 int nxt; 9 int w;10 }e[maxn<<1];11 void add_edge(int u,int v,int w){12 e[tot].to=v;13 e[tot].w=w;14 e[tot].nxt=head[u];15 head[u]=tot++;16 }17 18 void dfs1(int u,int fa){
//返回子树最大距离 19 for(int i=head[u];i!=-1;i=e[i].nxt){20 int v=e[i].to;21 if(v==fa) continue;22 dfs1(v,u);23 int tmp=d[v][0]+e[i].w;24 if(d[u][0]<=tmp){25 d[u][1]=d[u][0];26 d[u][0]=tmp;27 }else if(d[u][1]
>n){50 tot=0;51 memset(d,0,sizeof d);52 memset(head,-1,sizeof head);53 int a,b;54 for(int i=2;i<=n;i++){55 cin>>a>>b;56 add_edge(i,a,b);57 add_edge(a,i,b);58 }59 dfs1(1,-1);60 dfs2(1,-1);61 for(int i=1;i<=n;i++){62 cout<
<<"\n";63 }64 }65 return 0;66 }

 

转载于:https://www.cnblogs.com/elpsycongroo/p/7418815.html

你可能感兴趣的文章
Java构造方法、重载及垃圾回收
查看>>
.Net Core AES加密解密
查看>>
Spring Quartz实现任务调度
查看>>
python | 桶排序、冒泡排序、选择排序、去重
查看>>
两个Html页面之间值得传递
查看>>
EasyUI datagrid 的多条件查询
查看>>
Mac升级bash到最新版本
查看>>
利用vagrant打包系统--制作自己的box
查看>>
美女与硬币问题
查看>>
计算几何算法概览 (转)
查看>>
Notepad++的ftp远程编辑功能
查看>>
数据库多对多关联表(Python&MySQL)
查看>>
[实变函数]1.2 集合的运算
查看>>
第06天
查看>>
设计模式的征途—5.原型(Prototype)模式
查看>>
iOS10 app连接不上网络的问题
查看>>
结对开发之电梯调度最终稿(徐梦迪&刘博)
查看>>
simple java mail
查看>>
信息建模
查看>>
Mybatis 数据库物理分页插件 PageHelper
查看>>