POJ 1986 Distance Queries(查询两点距离,LCA)
来源:互联网 发布:网络调查的方法与步骤 编辑:程序博客网 时间:2024/05/20 00:17
题目链接:
POJ 1986 Distance Queries
题意:
给一个连通的
数据范围:
分析:
先用基于RMQ算法的求LCA的方法求出LCA。记
我建单向边wa了,双向边就AC了,不太懂啊。。。
时间复杂度:预处理:
#include <stdio.h>#include <string.h>#include <algorithm>#include <math.h>using namespace std;typedef long long ll;const int MAX_N = 40010;int n, m, total;int head[MAX_N], in[MAX_N], id[MAX_N], dis[MAX_N];int vis[MAX_N * 2], depth[MAX_N * 2], dp[MAX_N * 2][20];struct Edge { int v, w, next;}edge[MAX_N * 2];void AddEdge (int u, int v, int w){ edge[total].v = v, edge[total].w = w; edge[total].next = head[u]; head[u] = total++;}void dfs(int u, int p, int d, int& k){ vis[k] = u, id[u] = k; depth[k++] = d; for (int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].v, w = edge[i].w; if (v == p) continue; dis[v] = dis[u] + w; dfs(v, u, d + 1, k); vis[k] = u; depth[k++] = d; }}void RMQ(int root){ int k = 0; dfs(root, -1, 0, k); int mm = k; int e = (int)log2(mm + 1.0); for (int i = 0; i < mm; ++i) dp[i][0] = i; for (int j = 1; j <= e; ++j) { for (int i = 0; i + (1 << j) - 1 < mm; ++i) { int nxt = i + (1 << (j - 1)); if (depth[dp[i][j - 1]] < depth[dp[nxt][j - 1]]) { dp[i][j] = dp[i][j - 1]; } else { dp[i][j] = dp[nxt][j - 1]; } } }}int LCA(int u, int v){ int left = min(id[u], id[v]), right = max(id[u], id[v]); int k = (int)log2(right - left + 1.0); int pos, nxt = right - (1 << k) + 1; if (depth[dp[left][k]] < depth[dp[nxt][k]]) { pos = dp[left][k]; } else { pos = dp[nxt][k]; } return dis[u] + dis[v] - 2 * dis[vis[pos]];}void init(){ total = 0; memset(head, -1, sizeof(head)); memset(vis, 0, sizeof(head)); memset(in, 0, sizeof(in)); memset(dis, 0, sizeof(dis)); for (int i = 0; i <= n; ++i) { fa[i] = i; }}int main(){ while (~scanf("%d%d", &n, &m)) { init(); for (int i = 0; i < m; ++i) { int u, v, w; char s[10]; scanf("%d%d%d%s", &u, &v, &w, s); AddEdge(u, v, w); AddEdge(v, u, w); in[v]++; } int root; for (int i = 1; i <= n; ++i) { if (in[i] == 0) { root = i; break; } } RMQ(root); scanf("%d", &m); while (m--) { int u, v; scanf("%d%d", &u, &v); printf("%d\n", LCA(u, v)); } } return 0;}
0 0
- POJ 1986 Distance Queries(查询两点距离,LCA)
- poj 1986 Distance Queries(LCA求两点距离模版)
- POJ 1986 Distance Queries LCA树上两点的距离
- Poj 1986 Distance Queries (LCA 树上两点间最短距离)
- 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 【LCA转RMQ 裸题】【求两点最短距离】
- Python快速学习第三天
- 表单 fieldset
- 驴友计划
- 十、自定义标题栏
- python学习中一个单线程爬虫
- POJ 1986 Distance Queries(查询两点距离,LCA)
- PHP程序员的技术成长规划
- 【hdu】5618 Jam's problem again【cdq分治】
- CSS3选择器容易误解的点
- 数据类型 typeof
- 微信企业号自定义菜单拉取信息的实现
- hdu 2485 Destroying the bus stations【最大流Dinic+最短路floyd】好题
- Redis的主从复制
- 数据类型 constructor