POJ 2874 LCA 树上任意两点距离
来源:互联网 发布:海关数据网 编辑:程序博客网 时间:2024/05/18 22:41
本题说了是无环图,所以就是一片森林了。 而对于树上的任意两点,我们可以用LCA求其距离。距离为两个子节点到根的距离和减去最近祖先到根的距离的2倍。具体画图便可看出来。
并且图是无向图,所以LCA时需要进行标记
POJ 1986同这道题 基本一样
/*ID: CUGB-wwjPROG:LANG: C++*/#include <iostream>#include <vector>#include <list>#include <map>#include <set>#include <deque>#include <queue>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric>#include <utility>#include <sstream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <cctype>#include <string>#include <cstring>#include <cmath>#include <ctime>#define INF 1111111111#define MAXN 10005#define MAXM 1000005#define L(x) x<<1#define R(x) x<<1|1#define eps 1e-4using namespace std;struct node{ int v, w; node(){} node(int a, int b){ v = a; w = b;}};vector<node>tree[MAXN], ask[MAXN]; //tree里w代表权值,ask里w代表序号int dis[MAXN], father[MAXN], vis[MAXN], ans[MAXM];int n, m, c;void init(){ for(int i = 0; i <= n; i++) { dis[i] = 0; father[i] = i; vis[i] = 0; tree[i].clear(); ask[i].clear(); }}int find(int x){ if(father[x] == x) return x; int t = find(father[x]); father[x] = t; return t;}void LCA(int u, int w, int root){ dis[u] = w; father[u] = u; vis[u] = root; int size = tree[u].size(); for(int i = 0; i < size; i++) { if(!vis[tree[u][i].v]) { LCA(tree[u][i].v, tree[u][i].w + w, root); father[tree[u][i].v] = u; } } size = ask[u].size(); for(int i = 0; i < size; i++) { if(vis[ask[u][i].v]) { if(vis[ask[u][i].v] == root) ans[ask[u][i].w] = dis[u] + dis[ask[u][i].v] - 2 * dis[find(ask[u][i].v)]; else ans[ask[u][i].w] = -1; } }}int main(){ int u, v, w; while(scanf("%d%d%d", &n, &m, &c) != EOF) { init(); for(int i = 1; i <= m; i++) { scanf("%d%d%d", &u, &v, &w); node tmp1(v, w); node tmp2(u, w); tree[u].push_back(tmp1); tree[v].push_back(tmp2); } for(int i = 1; i <= c; i++) { scanf("%d%d", &u, &v); node tmp1(v, i); node tmp2(u, i); ask[u].push_back(tmp1); ask[v].push_back(tmp2); } for(int i = 1; i <= n; i++) { if(!vis[i]) LCA(i, 0, i); } for(int i = 1; i <= c; i++) { if(ans[i] == -1) printf("Not connected\n"); else printf("%d\n", ans[i]); } } return 0;}
- POJ 2874 LCA 树上任意两点距离
- POJ 1986 Distance Queries LCA树上两点的距离
- poj 1986 LCA 求树上任意两节点距离
- 【LCA转RMQ求树上任意两点最短路】HDU 2874
- Poj 1986 Distance Queries (LCA 树上两点间最短距离)
- poj 3764 字典树 树上任意两点边权异或最大值
- poj 2763 Housewife Wind 动态求树上两点之间距离
- poj 1986 Distance Queries(LCA求两点距离模版)
- POJ 1986 Distance Queries(查询两点距离,LCA)
- hdu 2376(求树上任意两点之间距离之和的平均值)
- hdu 2376 Average distance DFS 求树上任意两点距离和
- HDU2376Average distance(树形dp|树上任意两点距离和的平均值)
- LCA+RMQ求树中两点距离
- 动态修改询问树上两点距离 poj2763
- hdu2586 树上两点之间的距离 tarjan
- HDU 5723 Abandoned country (并查集 + DFS+求解树上任意两点间的距离的平均值)
- HDU 6115 Factory LCA求树上距离
- 树上两点最近公共祖先LCA的倍增算法 poj1986
- 自动匹配引入Javascript脚本
- Redhat Enterprise linux 上安装Oracle10g
- android界面设计更easy
- Win7系统优化十大技巧
- Javascript正则表达式常用举例
- POJ 2874 LCA 树上任意两点距离
- CSS透明及PNG背景透明处理
- Hibernate支持第三方的连接池,官方推荐的连接池是C3P0,Proxool,以及DBCP。在配置连接池时需要注意的有三点
- JAVA中初始化的顺序
- 用xcode4.3.2中的organizer顺利发布成功
- UVA:10034 - Freckles
- Android开发性能优化简介
- POJ-2112 Floyd+二分枚举+最大流(or 匈牙利)
- Openmesh ~ Status