【RMQ&LCA】Distance Queries(距离查询)
Time Limit:1000MS
Total Submit:24 Accepted:8
Description
距离查询(qu.pas/c/cpp)
【问题描述】
农民约翰的奶牛拒绝在跑他的马拉松,因为他选择的路径太长不适合奶牛们悠闲的生活方式。因此,他希望找到一个更合理的路径长度。农民约翰要查询一系列点对间的路径长度,请尽快回答农民约翰的询问!
Input
第一行包括两个整数N,M,N (2 <= N <= 40,000)表示农场数量,每个农场标记为1-N,M (1 <= M < 40,000)表示路径数量。
第二至M+1行,每行包括三个整数F1,F2,L和一个字符D,表示农场F1和F2之间的路径长度为L,D为'N', 'E', 'S', 'W'中的一个,表示从F1到F2的方向。
第M+2行包括一个整数K,1 <= K <= 10,000
第M+3至M+K+2行,每行包括两个整数,表示要询问的两个农场。
Output
共K行,每行输出每个询问的路径长度。
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
本题的图为一棵树。
先随便设一个根,算出每个点i到根的距离的的d[i]。
对于每一个询问x,y,距离为 d[x]+d[y]-d[x,y点的最近公共祖先]×2
一开始纠结于树的构建。
因为最多有40000条无向边,储存时就要储存80000条有向边。
开始只想用最简单的二维储存(a[i,j]表示i是j的父亲),但空间不允许,纠结了一会。
然后突然想到用链表。。。。。。。自己真是蠢透了。。
type
var
procedure dfs(x:longint);
var
begin
end;
function getfather(x:longint):longint;
begin
end;
procedure lca(x,s:longint);
var
begin
end;
procedure init;
var
begin
end;
procedure print;
var
begin
end;
begin
end.