树直径,节点最远距离 hdu 2196
来源:互联网 发布:央视网络电视台官网 编辑:程序博客网 时间:2024/06/01 08:41
题意:求每个节点的最远距离
分析:dfs1 求出直径的两个端点, dfs2 遍历每个点到端点的距离( 因为最远距离在该点到直径中的一个端点 )
#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <vector>#include <queue>#include <cmath>using namespace std;#define LL long long#define INF 0x3f3f3f3f#define fi first#define se second#define mem(a,b) memset((a),(b),sizeof(a))const LL MAXV=100000+3;struct Edge//边{ LL to,cost; Edge(LL t,LL c):to(t),cost(c){}};LL N,L,V1,V2,ans;vector<Edge> G[MAXV];//邻接表存树LL dp[MAXV],deep[MAXV],dis[2][MAXV];void init()//初始化{ for(LL i=1;i<=N;++i) { G[i].clear(); dp[i]=0; deep[i]=i; } L=0; ans=0;}void dfs1(LL u,LL fa)//树形dp求直径{ LL the_max=0,the_second=0,v1=u,v2=u; for(LL i=0;i<G[u].size();++i) { LL v=G[u][i].to; if(v==fa) continue; dfs1(v,u); LL now_dis=dp[v]+G[u][i].cost; if(now_dis>the_max) { the_second=the_max; v2=v1; the_max=now_dis; v1=deep[v]; } else if(now_dis>the_second) { the_second=now_dis; v2=deep[v]; } } dp[u]=the_max; deep[u]=v1; if(the_max+the_second>L) { L=the_max+the_second; V1=v1; V2=v2; }}void dfs2(LL u,LL fa,LL id)//求某一个点到其他距离的点{ for(LL i=0;i<G[u].size();++i) { LL v=G[u][i].to; if(v==fa) continue; dis[id][v]=dis[id][u]+G[u][i].cost; dfs2(v,u,id); }}int main(){ while(~scanf("%lld",&N)) { init(); for(LL i=2;i<=N;++i) { LL a,b,c; scanf("%lld%lld",&a,&b); G[i].push_back(Edge(a,b)); G[a].push_back(Edge(i,b)); } dfs1(1,-1); memset(dis,0,sizeof(dis)); dfs2(V1,-1,0); dfs2(V2,-1,1); for(LL u=1;u<=N;++u) { if(u==V1||u==V2) cout << L << endl; else cout << max(dis[0][u],dis[1][u]) << endl; } } return 0;}
阅读全文
0 0
- 树直径,节点最远距离 hdu 2196
- 树的直径(最远距离)
- HDU 2196 Computer(求树上每个节点到其它点的最远距离 树dp)
- hdu 2196(求树上每个节点到树上其他节点的最远距离)
- 二叉树节点的最远距离
- 计算二叉树中最远节点距离
- HDU 2196 Computer(求树上每个节点到其它点的最远距离)
- 求二叉树中最远两个节点距离
- 计算二叉树的任意两节点的最远距离。
- 二叉树的两节点的最远距离
- 求二叉树两节点的最远距离
- 求一颗二叉树中最远的两个节点的距离
- 对于树的最远两节点的距离的理解
- 查找二叉树最远两个节点的距离
- 二叉树的两个节点之间最远的距离
- 求二叉树中两个节点最远的距离
- 求二叉树中最远的两个节点的距离
- 求二叉树中最远的两个节点的距离
- 使用Gradle整合Flyway进行数据库迁移
- 不定位成一个连接者,家装公司进军智能装饰的所有姿势都是错的
- 思维导图绘制——个人经验分享
- c++语言的本地磁盘的读写
- java jdk配置环境变量
- 树直径,节点最远距离 hdu 2196
- 安卓笔记
- 装逼的头文件
- [Java]通过Selenium操作FireFox打开网页
- MAVEN配置环境变量
- MongoDB 删除数据库
- js开发:数组的push()、pop()、shift()和unshift()
- 【C/C++】如何避免由于编译器差别带来的错误
- 算法:汉诺塔(栈的递归调用)-数据结构(9)