《商務旅行》解題報告

2022-09-04 13:21:12 字數 1463 閱讀 6491

《商務旅行》解題報告

by mps

【題目描述】

某首都城市的商人要經常到各城鎮去做生意,他們按自己的路線去做,目的是為了更好的節約時間。

假設有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

25【輸出樣例】

7【分析】

數學建模:建成一棵樹,求這些點逐個的樹上最短路徑,演算法lca

兩個點的最短路徑=d(x)+d(y)-2*d(lca(x,y))

d是根到點的最短路徑

很明顯,就是該點的深度

通過倍增即可求出,然後直接模擬一下就ok了

【**】

1 #include 2 #include 3 #include 4 #include 5

using

namespace

std;67

const

int maxn=70001;8

9int deep[maxn],p[maxn][30

];10

intn,q;

1112

struct

liste[maxn];

15int head[maxn],cnt=0;16

17void addedge(int u,int

v)23

24void

init()34}

3536

int lca(int u,int

v)47

if(u==v)return

u;48

else

return p[u][0

]; 49}50

51void dfs(int

u)57

for(i=head[u];i;i=e[i].next)

58if(!deep[e[i].to])63}

6465

void

solve()

74 scanf("

%d",&u);

75for(i=2;i<=q;i++)

81 printf("%d"

,ans);82}

8384

intmain()

CodeVS1036 商務旅行

某首都城市的商人要經常到各城鎮去做生意,他們按自己的路線去做,目的是為了更好的節約時間。假設有n個城鎮,首都編號為1,商人從首都出發,其他各城鎮之間都有道路連線,任意兩個城鎮之間如果有直連道路,在他們之間行駛需要花費單位時間。該國公路網路發達,從首都出發能到達任意乙個城鎮,並且公路網路不會存在環。你...

Codevs 1036 商務旅行

1036 商務旅行 時間限制 1 s 空間限制 128000 kb 題目等級 鑽石 diamond 傳送門題目描述 description 某首都城市的商人要經常到各城鎮去做生意,他們按自己的路線去做,目的是為了更好的節約時間。假設有n個城鎮,首都編號為1,商人從首都出發,其他各城鎮之間都有道路連線...

Codevs 1036 商務旅行

時間限制 1 s 空間限制 128000 kb 題目等級 鑽石 diamond 題目描述 假設有n個城鎮,首都編號為1,商人從首都出發,其他各城鎮之間都有道路連線,任意兩個城鎮之間如果有直連道路,在他們之間行駛需要花費單位時間。該國公路網路發達,從首都出發能到達任意乙個城鎮,並且公路網路不會存在環。...