這段故事仍然不屬於勇者。
——————————————
題目描述 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,商人從首都出發,其他各城鎮之間都有道路連線,任意兩個城鎮之間如果有直連道路,在他們之間行駛需要花費單位時間。該國公路網路發達,從首都出發能到達任意乙個城鎮,並且公路網路不會存在環。...