loj 1257 (求树上每一个点到树上另一个点的最长距离)
来源:互联网 发布:java图书管理系统教程 编辑:程序博客网 时间:2024/05/29 04:10
题目链接:http://lightoj.com/volume_showproblem.php?problem=1257
思路:首先需要用到一个知识点就是树上任一点到树上最长直径的某一个端点的距离最远,因此我们可以用dp[u]表示从u点出发到的最远距离,然后从任意一点出发,一遍dfs求出树上最长直径的某一个端点,然后从这个端点出发,再次dfs求出另一个端点,最后在从求出的端点出发进行dfs更新.每次做dfs时都更新一下dp.
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7 8 const int MAXN = (30000 + 30); 9 struct Edge {10 int v, w, next;11 }edge[MAXN << 1];12 int n, ans, NE, End, maxlen;13 int head[MAXN];14 15 void Insert(int u, int v, int w)16 {17 edge[NE].v = v;18 edge[NE].w = w;19 edge[NE].next = head[u];20 head[u] = NE++;21 }22 23 int dp[MAXN];24 void dfs(int u, int father, int len)25 {26 if (len > maxlen) {27 maxlen = len;28 End = u;29 }30 for (int i = head[u]; i != -1; i = edge[i].next) {31 int v = edge[i].v;32 int w = edge[i].w;33 if (v == father) continue;34 dfs(v, u, len + w);35 dp[v] = max(dp[v], len + w);36 }37 }38 39 int main()40 {41 int _case, t = 1;42 scanf("%d", &_case);43 while (_case--) {44 scanf("%d", &n);45 NE = 0;46 memset(head, -1, sizeof(head));47 for (int i = 1; i < n; i++) {48 int u, v, w;49 scanf("%d %d %d", &u, &v, &w);50 Insert(u, v, w);51 Insert(v, u, w);52 }53 maxlen = 0;54 memset(dp, 0, sizeof(dp));55 dfs(1, -1, 0);56 dfs(End, -1, 0);57 dfs(End, -1, 0);58 printf("Case %d:\n", t++);59 for (int i = 0; i < n; i++) {60 printf("%d\n", dp[i]);61 }62 }63 return 0;64 }
0 0
- loj 1257 (求树上每一个点到树上另一个点的最长距离)
- HDU 2196 Computer(求树上每个节点到其它点的最远距离)
- HDU 2196 - Computer (树上每点最长距离 DP)
- hdu2196(求每一点在树上最远距离)
- HDU 2196 Computer(求树上每个节点到其它点的最远距离 树dp)
- loj 1412(树上最长直径的应用)
- hdu2196 Computer 树形DP 树上点到其它点的最远距离
- hdu 4612 Warm up (手动扩栈,求树上哪两个点的距离最远)
- ural1752找树上距某个点某距离的点(树的直径+倍增)
- 【训练题】小树 | 计算树上各点的深度和到根的距离
- HDU 2376(树上任意2点间的距离)
- hdu 2586 树上点对最近距离 (lca)
- 求树上每个节点到其他节点的最远距离
- hdu 2196(求树上每个节点到树上其他节点的最远距离)
- 树上基于点的分治
- 【HDU】2586 How far away ? LCA求树上点对最近距离
- hdu 2196 computer 求树上的任意最远点对 O(n)
- hdu2196Computer 经典树形dp 在树上求最长距离
- java大数取模
- [LeetCode]Next Permutation
- loj1011 状态压缩
- loj 1030概率dp
- loj 1032 数位dp
- loj 1257 (求树上每一个点到树上另一个点的最长距离)
- loj 1337
- loj 1357(树形dp)
- loj 1210 (求最少的加边数使得图变成强连通)
- loj 1406(状态压缩)
- loj 1429(可相交的最小路径覆盖)
- poj上的dp专题
- poj 3895(求无向图的最大简单环)
- spfa求最长路