time limit: 3 sec memory limit: 128 mb
submit: 8 solved: 8
[submit][status]
某首都城市的商人要經常到各城鎮去做生意,他們按自己的路線去做,目的是為了更好的節約時間。
假設有n個城鎮,首都編號為1,商人從首都出發,其他各城鎮之間都有道路連線,任意兩個城鎮之間如果有直連道路,在他們之間行駛需要花費單位時間。該國公路網路發達,從首都出發能到達任意乙個城鎮,並且公路網路不會存在環。
你的任務是幫助該商人計算一下他的最短旅行時間。
第一行有乙個整數n,1<=n
<=30 000,為城鎮的數目。下面n-1行,每行由兩個整數a 和b (1<=a, b
<=n; a<>b)組成,表示城鎮a和城鎮b有公路連線。在第n+1行為乙個整數m,下面的m行,每行有該商人需要順次經過的各城鎮編號。
輸出該商人旅行的最短時間。
51 2
1 53 5
4 5413
257題解:本來想在codevs做一道線段樹題目的,可是進入線段樹分類後就發現了這個(hansbug:呵呵呵呵這個也叫線段樹我也是醉了)只要學過lca的童鞋不難發現這就是乙個最裸的lca,直接上倍增搞搞就行了,連加上邊長陣列都免了。。。
1type
2 point=^node;
3 node=record
4g:longint;
5next:point;
6end;7
8var
9i,j,k,l,m,n,t:longint;
10 a:array[0..50000] of
point;
11 c:array[0..20,0..50000] of
longint;
12 d:array[0..50000] of
longint;
13function
min(x,y:longint):longint;inline;
14begin
15if xthen min:=x else min:=y;
16end;17
function
max(x,y:longint):longint;inline;
18begin
19if x>y then max:=x else max:=y;
20end;21
procedure swap(var
x,y:longint);inline;
22var
z:longint;
23begin
24 z:=x;x:=y;y:=z;
25end;26
procedure
add(x,y:longint);inline;
27var
p:point;
28begin
29new(p);
30 p^.g:=y;
31 p^.next:=a[x];
32 a[x]:=p;
33end;34
procedure
dfs(x:longint);inline;
35var
p:point;
36begin
37 p:=a[x];
38while p<>nil
do39
begin
40if c[0,p^.g]=0
then
41begin
42 c[0,p^.g]:=x;
43 d[p^.g]:=d[x]+1;44
dfs(p^.g);
45end
;46 p:=p^.next;
47end;48
end;
49function
getfat(x,y:longint):longint;inline;
50var
i,j,k:longint;
51begin
52 i:=0;53
while y>0
do54
begin
55if odd(y) then x:=c[i,x];
56 inc(i);y:=y div2;
57end
;58 getfat:=x;
59end;60
function
dis(x,y:longint):longint;
61var
62a1,a2,a3,i,j,k,l:longint;
63begin
64if d[x]then
swap(x,y);
65 a1:=x;a2:=y;
66 x:=getfat(x,d[x]-d[y]);
67if x=y then exit(d[a1]-d[a2]);
68for i:=20
downto0do
69begin
70if c[i,x]=0
then
continue;
71if c[i,x]<>c[i,y] then
72begin
73 x:=c[i,x];
74 y:=c[i,y];
75end
76end
;77 a3:=c[0
,x];
78 exit(d[a1]+d[a2]-d[a3]-d[a3]);
79end;80
81begin
82readln(n);
83for i:=1
to n do a[i]:=nil;84
for i:=1
to n-1
do85
begin
86readln(j,k);
87add(j,k);add(k,j);
88end
;89 fillchar(c,sizeof(c),0
);90 fillchar(d,sizeof(d),0
);91 c[0,1]:=-1
;92 dfs(1);c[0,1]:=0;93
for i:=1
to20
do94
for j:=1
to n do
95 c[i,j]:=c[i-1,c[i-1
,j]];
96readln(m);
97 readln(j);l:=0;98
for i:=1
to m-1
do99
begin
100 k:=j;
101readln(j);
102 t:=dis(k,j);
103 l:=l+t;
104end
;105
writeln(l);
106readln;
107end
.108
《商務旅行》解題報告
商務旅行 解題報告 by mps 題目描述 某首都城市的商人要經常到各城鎮去做生意,他們按自己的路線去做,目的是為了更好的節約時間。假設有n個城鎮,首都編號為1,商人從首都出發,其他各城鎮之間都有道路連線,任意兩個城鎮之間如果有直連道路,在他們之間行駛需要花費單位時間。該國公路網路發達,從首都出發能...
CodeVS1036 商務旅行
某首都城市的商人要經常到各城鎮去做生意,他們按自己的路線去做,目的是為了更好的節約時間。假設有n個城鎮,首都編號為1,商人從首都出發,其他各城鎮之間都有道路連線,任意兩個城鎮之間如果有直連道路,在他們之間行駛需要花費單位時間。該國公路網路發達,從首都出發能到達任意乙個城鎮,並且公路網路不會存在環。你...
Codevs 1036 商務旅行
1036 商務旅行 時間限制 1 s 空間限制 128000 kb 題目等級 鑽石 diamond 傳送門題目描述 description 某首都城市的商人要經常到各城鎮去做生意,他們按自己的路線去做,目的是為了更好的節約時間。假設有n個城鎮,首都編號為1,商人從首都出發,其他各城鎮之間都有道路連線...