POJ 1849 Two(求树的直径)
来源:互联网 发布:mac mini更换固态硬盘 编辑:程序博客网 时间:2024/05/17 03:34
题意:
两个人,遍历树上的所有点,付出的最小代价。
分析可知,最小代价即为所有边的权值的2倍减去树的直径。
#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <cmath>#include <queue>#include <stack>#include <algorithm>#define LL long longusing namespace std;const int MAXN = 100000 + 10;struct Edge{ int to, next, w;}edges[2 * MAXN];int tot;int head[MAXN];int dis[MAXN];int N, S;void init(){ tot = 0; memset(head, -1, sizeof(head));}void addedge(int u, int v, int w){ edges[tot].to = v; edges[tot].next = head[u]; edges[tot].w = w; head[u] = tot++;}int dfs(int u, int pre = -1){ int ans = u; for(int i=head[u];i!=-1;i=edges[i].next) { int v = edges[i].to; if(v == pre) continue; dis[v] = dis[u] + edges[i].w; int dv = dfs(v, u); if(dis[ans] < dis[dv]) ans = dv; } return ans;}int solve(int u){ dis[u] = 0; u = dfs(u); dis[u] = 0; return dis[dfs(u)];}int main(){ while(scanf("%d%d", &N, &S)!=EOF) { int u, v, w; init(); int ans = 0; for(int i=1;i<N;i++) { scanf("%d%d%d", &u, &v, &w); addedge(u, v, w); addedge(v, u, w); ans += w; } int D = solve(1); ans = ans * 2 - D; cout << ans << endl; } return 0;}
0 0
- POJ 1849 Two(求树的直径)
- POJ 1849 Two(树的直径)
- POJ 1849 Two///树的直径
- POJ 1849 Two 树的直径
- POJ 1849 Two【树的直径+树的遍历】
- POJ 1849 Two(树的直径--树形DP)(好题)
- POJ 1985 Cow Marathon(求树的直径)
- [POJ-2631] 求树的直径
- poj-1839-Two 树形dp/树的直径
- POJ 1849 Two (树形dp 树的直径 两种方法)
- 求树的直径
- 求树的直径
- 求树的直径
- 求树的直径
- POJ--3567[Cactus Reloaded] 求仙人掌树的直径
- [poj 1985]Cow Marathon[求树的直径][BFS]
- POJ 1985 求树的直径 两边搜OR DP
- 求树的直径(poj1383验证)
- 黑马程序员——Java基础---Java语言中的关键字
- 九度oj 1018
- ZOJ2099
- NYOJ 998 解题报告
- 1024. 科学计数法 (20)
- POJ 1849 Two(求树的直径)
- 水平和竖直方向图像拉升
- 数据结构—二叉树的四种遍历
- Linux学习与总结:-2Linux常用命令
- springMVC对异常处理的支持
- Android应用安全测试点滴
- 外键约束
- cenos中vi/vim界面中文乱码解决方法
- android开发之broadcast学习笔记