hdu 2196(求树上每个节点到树上其他节点的最远距离)
来源:互联网 发布:linux多线程编程 书籍 编辑:程序博客网 时间:2024/05/29 02:34
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196
思路:首先任意一次dfs求出树上最长直径的一个端点End,然后以该端点为起点再次dfs求出另一个端点,然后再次以求出的另一个端点为起点dfs,每次做dfs的时候都更新dist[](dist[u]表示u到树上任意节点的最远距离),可以证明树上任意某个节点到树上任意节点的最远距离的端点一定会是树上直径的两个端点之一。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 using namespace std; 7 #define MAXN 10100 8 9 struct Edge{10 int v,w;11 Edge(int vv,int ww):v(vv),w(ww){}12 };13 14 int n;15 int dist[MAXN],max_len,End;16 vector<vector<Edge> >G;17 18 void dfs(int u,int father,int len)19 {20 if(len>max_len)max_len=len,End=u;21 for(int i=0;i<G[u].size();i++){22 int v=G[u][i].v,w=G[u][i].w;23 if(v==father)continue;24 dfs(v,u,len+w);25 dist[v]=max(dist[v],len+w);26 }27 }28 29 int main()30 {31 int u,w;32 while(~scanf("%d",&n)){33 G.clear();34 G.resize(n+2);35 for(int i=2;i<=n;i++){36 scanf("%d%d",&u,&w);37 G[i].push_back(Edge(u,w));38 G[u].push_back(Edge(i,w));39 }40 memset(dist,0,sizeof(dist));41 max_len=0;42 dfs(1,-1,0);43 dfs(End,-1,0);//分别从最长路的两端进行dfs.44 dfs(End,-1,0);45 for(int i=1;i<=n;i++){46 printf("%d\n",dist[i]);47 }48 }49 return 0;50 }
0 0
- hdu 2196(求树上每个节点到树上其他节点的最远距离)
- 求树上每个节点到其他节点的最远距离
- HDU 2196 Computer(求树上每个节点到其它点的最远距离)
- HDU 2196 Computer(求树上每个节点到其它点的最远距离 树dp)
- (HDU 2196) Computer <树型DP经典题目 & dfs> 求树上每个节点到最远的叶子结点的路径长度
- 树上求节点的深度
- hdu 4612 Warm up (手动扩栈,求树上哪两个点的距离最远)
- 寻找一棵树上最远的两个节点
- (续)寻找一棵树上最远的两个节点
- 树上最远距离练习
- poj 1986 LCA 求树上任意两节点距离
- 树直径,节点最远距离 hdu 2196
- 整棵树上节点间的最大距离
- hdu 2196 computer 求树上的任意最远点对 O(n)
- hdu2196(求每一点在树上最远距离)
- 求二叉树中最远的两个节点的距离
- 求二叉树中最远的两个节点的距离
- ~求二叉树中最远的两个节点的距离~
- hdu 4708(暴力+找规律)
- hdu 3905(dp)
- hdu 4714(树形dp)
- hdu 3899(树形dp)
- hdu 4003(树形dp)
- hdu 2196(求树上每个节点到树上其他节点的最远距离)
- hdu 2809(状压dp)
- hdu 1561(树形dp)
- hdu 1520(简单树形dp)
- hdu 1513(dp+滚动数组)
- hdu 4240在(最大流)
- 大端法、小端法、网络字节序
- hdu 4722(记忆化搜索)
- hdu 4496(并查集)