小機房有棵煥狗種的樹,樹上有n個節點,節點標號為0到n-1,有兩隻蟲子名叫飄狗和大吉狗,分居在兩個不同的節點上。有一天,他們想爬到乙個節點上去搞基,但是作為兩隻蟲子,他們不想花費太多精力。已知從某個節點爬到其父親節點要花費 c 的能量(從父親節點爬到此節點也相同),他們想找出一條花費精力最短的路,以使得搞基的時候精力旺盛,他們找到你要你設計乙個程式來找到這條路,要求你告訴他們最少需要花費多少精力
輸入描述 input description
第一行乙個n,接下來n-1行每一行有三個整數u,v, c 。表示節點 u 爬到節點 v 需要花費 c 的精力。第n+1行有乙個整數m表示有m次詢問。接下來m行每一行有兩個整數 u ,v 表示兩隻蟲子所在的節點
輸出描述 output description
一共有m行,每一行乙個整數,表示對於該次詢問所得出的最短距離。
樣例輸入 sample input 3
1 0 1
2 0 1
31 0
2 01 2
樣例輸出 sample output 1
12資料範圍及提示 data size & hint
1<=n<=50000, 1<=m<=75000, 0<=c<=1000
簡單lca,注意帶權與不帶權;;;;
program exam1;
type ab=^node;
node=record
a,b:longint;
c:ab;
end;
var n,m,i,j,s,t,k:longint;
p:array[0..60000]of ab;
f,d,g:array[0..60000]of longint;
v:array[0..60000]of boolean;
procedure put(x,y,z:longint);
var ii:ab;
begin
ii:=p[x];
new(p[x]);
p[x]^.a:=y;
p[x]^.b:=z;
p[x]^.c:=ii;
end;
procedure dfs(x:longint);
var i,j:longint;
ii:ab;
begin
v[x]:=true;
ii:=p[x];
while ii<>nil do
begin
if not v[ii^.a] then
begin
f[ii^.a]:=x;
d[ii^.a]:=d[x]+1;
g[ii^.a]:=ii^.b;
dfs(ii^.a);
end;
ii:=ii^.c;
end;
end;
function lca(x,y:longint):longint;
var k:longint;
begin
lca:=0;
if d[x] begin
k:=x; x:=y; y:=k;
end;
while d[x]>d[y] do
begin
lca:=lca+g[x];
x:=f[x];
end;
while x<>y do
begin
lca:=lca+g[x]; lca:=lca+g[y];
x:=f[x]; y:=f[y];
end;
end;
begin
readln(n);
for i:=1 to n-1 do
begin
readln(s,t,k);
put(s,t,k);
put(t,s,k);
end;
fillchar(v,sizeof(v),0);
fillchar(d,sizeof(d),0);
d[1]:=0;
d[1]:=0;
dfs(1);
readln(k);
for i:=1 to k do
begin
readln(s,t);
writeln(lca(s,t));
end;
end.
2370 小機房的樹 (倍增LCA)
小機房有棵煥狗種的樹,樹上有n個節點,節點標號為0到n 1,有兩隻蟲子名叫飄狗和大吉狗,分居在兩個不同的節點上。有一天,他們想爬到乙個節點上去搞基,但是作為兩隻蟲子,他們不想花費太多精力。已知從某個節點爬到其父親節點要花費 c 的能量 從父親節點爬到此節點也相同 他們想找出一條花費精力最短的路,以使...
codevs 2370 小機房的樹 (LCA)
codevs 2370 小機房的樹 題意 就是求裸的lca 題解 include include include using namespace std const int maxn 100000 int fa maxn 21 第i個節點跳2 j次方步找到的父節點 int dis maxn 21 第...
codevs 2370 小機房的樹 (LCA)
小機房有棵煥狗種的樹,樹上有n個節點,節點標號為0到n 1,有兩隻蟲子名叫飄狗和大吉狗,分居在兩個不同的節點上。有一天,他們想爬到乙個節點上去搞基,但是作為兩隻蟲子,他們不想花費太多精力。已知從某個節點爬到其父親節點要花費 c 的能量 從父親節點爬到此節點也相同 他們想找出一條花費精力最短的路,以使...