POJ 1986Distance Queries(LCA)
来源:互联网 发布:猎流软件怎么样 编辑:程序博客网 时间:2024/06/12 00:09
题意:
给定的一棵树,边数卖萌的,(u,v,c,d),d方向也是卖萌的
K≤104次询问,dis(u,v)
分析:
树上2点之间距离dis(u,v)=dis(u)+dis(v)−2∗dis(lca(u,v))
剩下就是lca模版题
代码:
//// Created by TaoSama on 2015-11-09// Copyright (c) 2015 TaoSama. All rights reserved.////#pragma comment(linker, "/STACK:1024000000,1024000000")#include <algorithm>#include <cctype>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iomanip>#include <iostream>#include <map>#include <queue>#include <string>#include <set>#include <vector>using namespace std;#define pr(x) cout << #x << " = " << x << " "#define prln(x) cout << #x << " = " << x << endlconst int N = 1e5 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7;int n, m, q;int vs[N << 1], dep[N << 1], first[N], dfsNum;int getMin(int x, int y) { return dep[x] < dep[y] ? x : y;}struct SparseTable { int dp[20][N << 1]; void init(int n) { for(int i = 1; i <= n; ++i) dp[0][i] = i; for(int i = 1; 1 << i <= n; ++i) for(int j = 1; j + (1 << i) - 1 <= n; ++j) dp[i][j] = getMin(dp[i - 1][j], dp[i - 1][j + (1 << i - 1)]); } int RMQ(int l, int r) { int k = 31 - __builtin_clz(r - l + 1); return getMin(dp[k][l], dp[k][r - (1 << k) + 1]); }} st;struct Edge { int v, c;};vector<Edge> G[N];int dp[N];void dfs(int u, int f, int d) { vs[++dfsNum] = u; dep[dfsNum] = d; first[u] = dfsNum; for(int i = 0; i < G[u].size(); ++i) { Edge &e = G[u][i]; if(e.v == f) continue; dp[e.v] = dp[u] + e.c; dfs(e.v, u, d + 1); vs[++dfsNum] = u; dep[dfsNum] = d; }}void init() { dfsNum = 0; dfs(1, -1, 0); st.init(2 * n - 1);}int lca(int u, int v) { if(first[u] > first[v]) swap(u, v); int idx = st.RMQ(first[u], first[v]); return vs[idx];}int main() {#ifdef LOCAL freopen("C:\\Users\\TaoSama\\Desktop\\in.txt", "r", stdin);// freopen("C:\\Users\\TaoSama\\Desktop\\out.txt","w",stdout);#endif ios_base::sync_with_stdio(0); while(scanf("%d%d", &n, &m) == 2) { for(int i = 1; i <= n; ++i) G[i].clear(); while(m--) { int u, v, c, d[2]; scanf("%d%d%d%s", &u, &v, &c, d); G[u].push_back((Edge) {v, c}); G[v].push_back((Edge) {u, c}); } init(); scanf("%d", &q); while(q--) { int u, v; scanf("%d%d", &u, &v); int _lca = lca(u, v); printf("%d\n", dp[u] + dp[v] - 2 * dp[_lca]); } } return 0;}
0 0
- POJ 1986Distance Queries(LCA)
- POJ 1986 Distance Queries [LCA]
- poj 1986 Distance Queries LCA
- POJ 1986 Distance Queries(LCA)
- poj 1986 Distance Queries (LCA)
- POJ 1986 Distance Queries LCA
- [POJ 1986] Distance Queries (LCA)
- Distance Queries - POJ 1986 LCA
- poj 1986 Distance Queries(LCA)
- POJ 1986 Distance Queries【LCA】
- Poj 1986 Distance Queries【LCA】
- POJ 1986 Distance Queries 【LCA】
- |poj 1986|LCA|Distance Queries
- POJ 1986 Distance Queries (Tarjan-LCA算法)(带权值)
- poj 1986 Distance Queries(LCA模板题)
- poj 1986 Distance Queries(LCA求两点距离模版)
- POJ 1986 Distance Queries(LCA Tarjan离线算法)
- POJ 题目1986 Distance Queries(LCA 离线)
- docker 在Oracle Linux7 安装与配置
- Android Proguard apk防止破解
- 从框架到完整项目搭建,实战项目《约个球》(8)- 将项目迁移到android studio,使用gradle搭建android项目(中)
- 富媒体推送
- Google C++编程风格指南(四)之类的相关规范
- POJ 1986Distance Queries(LCA)
- openwrt编译curl及错误解决方案
- 【莫比乌斯反演】【数论】[ZBOJ 2693]jzptab
- 安装rails-for-ruby环境并运行rails项目全过程
- oc的基础知识
- JSON对象中的JSONObject和JSONArray以及与Map、String、数组的转化
- 十款最常见的Linux发行版及目标用户
- USACO-Section 2.3 Longest Prefix (DP)
- java 图片压缩工具类