Codevs 1036 商務旅行 題解

2021-08-02 02:44:40 字數 1634 閱讀 8059

這段故事仍然不屬於勇者。

——————————————

題目描述 description

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

假設有n個城鎮,首都編號為1,商人從首都出發,其他各城鎮之間都有道路連線,任意兩個城鎮之間如果有直連道路,在他們之間行駛需要花費單位時間。該國公路網路發達,從首都出發能到達任意乙個城鎮,並且公路網路不會存在環。

你的任務是幫助該商人計算一下他的最短旅行時間。

輸入描述 input description

輸入檔案中的第一行有乙個整數n,1<=n<=30 000,為城鎮的數目。下面n-1行,每行由兩個整數a 和b (1<=a, b<=n; a<>b)組成,表示城鎮a和城鎮b有公路連線。在第n+1行為乙個整數m,下面的m行,每行有該商人需要順次經過的各城鎮編號。

輸出描述 output description

在輸出檔案中輸出該商人旅行的最短時間。

樣例輸入 sample input

5 1 2

1 5

3 5

4 5

4 1

3 2

5 樣例輸出 sample output

7 ————————————————

照理來說明白了倍增lca之後就能ac的題。

然後路由器花了一整週的時間debug。

另外多虧了網際網路的神奇功能。

看了大家的題解之後驚醒發現乙個問題。

鏈式前向星一定要開二倍大!(很容易明白這個問題……然而debug……)

好的廢話不多說,倍增lca暴力解決就ok。

這題只要有思想就能ac啦!小細節在**裡給注釋。

#include

#include

#include

#include

#include

#include

using

namespace

std;

int deep[30010]=;//節點深度

int anc[30010][16]=;

int m,n,cnt=0;

int cnt1=0,head[60020]=; //二倍大!

structedge[60020];//二倍大!

void add(int u,int v)

void dfs(int i)

}return;

}int suan(int i,int j)

}if(deep[i]>deep[j])else

}if(i==j)return i;//這裡要注意!!wa過一次

while(anc[i][0]!=anc[j][0])

i=anc[i][k];j=anc[j][k];

}return anc[i][0];//lca

}int main()

dfs(1);

for(int j=1;j<=14;j++)

}scanf("%d",&m);

int start=1,end;

for(int i=1;i<=m;i++)

printf("%d",cnt);

return

0;}

CodeVS1036 商務旅行

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

Codevs 1036 商務旅行

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

Codevs 1036 商務旅行

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