《商務旅行》解題報告
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 5using
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,商人從首都出發,其他各城鎮之間都有道路連線,任意兩個城鎮之間如果有直連道路,在他們之間行駛需要花費單位時間。該國公路網路發達,從首都出發能到達任意乙個城鎮,並且公路網路不會存在環。...