POJ1986-Distance Queries(LCA)
2017-07-23 10:25
369 查看
Distance Queries
Description
Farmer John's cows refused to run in his marathon since he chose a path much too long for their leisurely lifestyle. He therefore wants to find a path of a more reasonable length. The input to this problem consists of the same input as in "Navigation Nightmare",followed
by a line containing a single integer K, followed by K "distance queries". Each distance query is a line of input containing two integers, giving the numbers of two farms between which FJ is interested in computing distance (measured in the length of the roads
along the path between the two farms). Please answer FJ's distance queries as quickly as possible!
Input
* Lines 1..1+M: Same format as "Navigation Nightmare"
* Line 2+M: A single integer, K. 1 <= K <= 10,000
* Lines 3+M..2+M+K: Each line corresponds to a distance query and contains the indices of two farms.
Output
* Lines 1..K: For each distance query, output on a single line an integer giving the appropriate distance.
Sample Input
Sample Output
Hint
Farms 2 and 6 are 20+3+13=36 apart.
Source
USACO 2004 February
题意:给你一棵树,数的每条边都有边权,有q次询问,查询出两点之间的距离
解题思路:LCA
Time Limit: 2000MS | Memory Limit: 30000K | |
Total Submissions: 13987 | Accepted: 4924 | |
Case Time Limit: 1000MS |
Farmer John's cows refused to run in his marathon since he chose a path much too long for their leisurely lifestyle. He therefore wants to find a path of a more reasonable length. The input to this problem consists of the same input as in "Navigation Nightmare",followed
by a line containing a single integer K, followed by K "distance queries". Each distance query is a line of input containing two integers, giving the numbers of two farms between which FJ is interested in computing distance (measured in the length of the roads
along the path between the two farms). Please answer FJ's distance queries as quickly as possible!
Input
* Lines 1..1+M: Same format as "Navigation Nightmare"
* Line 2+M: A single integer, K. 1 <= K <= 10,000
* Lines 3+M..2+M+K: Each line corresponds to a distance query and contains the indices of two farms.
Output
* Lines 1..K: For each distance query, output on a single line an integer giving the appropriate distance.
Sample Input
7 6 1 6 13 E 6 3 9 E 3 5 7 S 4 1 3 N 2 4 20 W 4 7 2 S 3 1 6 1 4 2 6
Sample Output
13 3 36
Hint
Farms 2 and 6 are 20+3+13=36 apart.
Source
USACO 2004 February
题意:给你一棵树,数的每条边都有边权,有q次询问,查询出两点之间的距离
解题思路:LCA
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <algorithm> #include <cmath> #include <vector> #include <map> #include <set> #include <queue> #include <stack> #include <functional> #include <climits> using namespace std; #define LL long long const int INF = 0x7FFFFFFF; int f[50009][20],dp[50009][20]; int s[50009], nt[50009 * 2], e[50009 * 2], w[50009 * 2],deep[50009],vis[50009]; char ch[5]; void dfs(int k) { vis[k] = 1; for (int i = 1; i < 19; i++) { if (deep[k] < (1 << i)) break; dp[k][i] = dp[k][i - 1] + dp[f[k][i - 1]][i - 1]; f[k][i] = f[f[k][i - 1]][i - 1]; } for (int i = s[k]; ~i; i = nt[i]) { int ee = e[i]; if (vis[ee]) continue; deep[ee] = deep[k] + 1,f[ee][0] = k,dp[ee][0] = w[i]; dfs(ee); } } int lca(int x, int y) { if (deep[x] < deep[y]) swap(x, y); int k = deep[x] - deep[y],ans=0; for (int i = 0; i < 20; i++) if (k&(1 << i)) ans += dp[x][i], x = f[x][i]; for (int i = 19; i >= 0; i--) if (f[x][i] != f[y][i]) ans = ans + dp[x][i] + dp[y][i], x = f[x][i], y = f[y][i]; if (x == y) return ans; return ans + dp[x][0] + dp[y][0]; } int main() { int n, q; while (~scanf("%d%d", &n, &q)) { int u, v, ww,cnt=1; memset(s, -1, sizeof s); for (int i = 1; i < n; i++) { scanf("%d%d%d%s", &u, &v, &ww,ch); nt[cnt] = s[u], s[u] = cnt, e[cnt] = v, w[cnt++] = ww; nt[cnt] = s[v], s[v] = cnt, e[cnt] = u, w[cnt++] = ww; } deep[1] = 0; memset(vis, 0, sizeof vis); memset(f, 0, sizeof f); memset(dp, 0, sizeof dp); dfs(1); scanf("%d", &q); while (q--) { int x, y; scanf("%d%d", &x, &y); printf("%d\n",lca(x, y)); } } return 0; }
相关文章推荐
- POJ 1986 - Distance Queries(LCA‘ 在线算法RMQ)
- poj 1986 Distance Queries(LCA离线Tarjan算法)
- POJ1986 DistanceQueries 最近公共祖先LCA 离线算法Tarjan
- poj 1986 Distance Queries 带权lca 模版题
- POJ 1986 Distance Queries LCA和RMQ
- POJ 1986 Distance Queries(在线LCA)
- POJ1986:Distance Queries(LCA求距离 + Tarjan)
- POJ_1986_Distance Queries(LCA+tarjan)
- poj1986 LCA
- POJ 1986(LCA and RMQ)
- poj1986 Distance Queries(LCA)
- POJ 1986 Distance Queries(离线tarjan-LCA)
- POJ 1986 Distance Queries(求最近公共祖先,LCA-Tarjan)
- poj1986 LCA转化为RMQ在线算法模板题
- POJ1986 DistanceQueries 最近公共祖先LCA 离线算法Tarjan
- poj 1986 Distance Queries(LCA)
- Distance Queries - POJ 1986 LCA
- POJ1986 Distance Queries (tarjan算法LCA 模板题)
- POJ 1986 Distance Queries LCA两点距离树
- POJ 1986 Distance Queries【LCA】