2953 Poi2002 商務旅行

2022-01-10 23:39:15 字數 3858 閱讀 5874

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,直接上倍增搞搞就行了,連加上邊長陣列都免了。。。

1

type

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,商人從首都出發,其他各城鎮之間都有道路連線...