POJ 1849 Two
来源:互联网 发布:网络分销渠道有哪些 编辑:程序博客网 时间:2024/06/06 15:48
求树的直径要先bfs找到任意起点能走到的最远的点,然后再以找到的点为起点bfs。
本题要求两点遍历树,实际是求两倍权和-树的直径,证明不缀。
//注意拓展点的循环的条件是i != -1还是i != 0. #include<cstdio>#include<queue>#include<cstring>#include<iostream>using namespace std;const int maxn = 100010;int n, s, tot, end;int sum;int st[maxn], d[maxn], vis[maxn];struct node{ int to, w, next;} edge[2*maxn];void in(int u, int v, int w){ edge[++tot].to = v; edge[tot].w = w; edge[tot].next = st[u]; st[u] = tot;}int bfs(int start){ memset(vis, 0, sizeof(vis)); d[start] = 0; int diameter = 0; queue<int> q; q.push(start); vis[start] = 1; while(!q.empty()){ int u = q.front(); q.pop(); for(int i = st[u]; i != 0; i = edge[i].next){ int v = edge[i].to; if(!vis[v]){ d[v] = d[u] + edge[i].w; if(d[v] > diameter){ diameter = d[v]; end = v; } vis[v] = 1; q.push(v); } } } return diameter;}int main(){ cin >> n >> s; for(int i = 1, u, v, w; i <= n-1; i++){ cin >> u >> v >> w; sum += w*2; in(u, v, w); in(v, u, w); } end = s; bfs(s); int dia = bfs(end); cout << sum - dia << endl; return 0;}
阅读全文
0 0
- poj 1849 Two
- POJ 1849 Two
- POJ 1849 Two
- POJ 1849 Two 笔记
- POJ 1849 Two(遍历树)
- POJ 1849 Two(树的直径)
- POJ 1849 Two///树的直径
- POJ 1849 Two 树的直径
- poj 1849 Two 树形dp好题
- poj 2738 Two Ends
- Poj 3320(two pointers)
- Poj 2566(two pointers)
- Poj 3678 (two-sat)
- POJ 1849 Two(求树的直径)
- POJ 1849 Two【树的直径+树的遍历】
- Poj 2723(two-sat)
- poj 2090 Two-Stacks Solitaire
- POJ 1334 Two Mountaineers 笔记
- 二级C 2017.6.14
- lodop打印维护功能
- 工作中遇到一些知识点2017.6.14
- eclipse中复制导入的项目并且修改了项目名字,项目后面的括号显示原来项目的名字
- VS2010+QT5开发所踩的坑以各种问题解决
- POJ 1849 Two
- java线程安全之——可重入锁
- redis-JedisPoolConfig配置
- Android源码解析资料
- 解决mac mysql初始化密码问题
- 大话数据结构--你数据结构怎么学的?
- C++中abort()函数与exit()函数区别
- Android UI性能优化 – Overdraw
- sessionid如何产生?由谁产生?保存在哪里?