Codevs 1036 商務旅行

2021-07-14 14:57:06 字數 2619 閱讀 3307

1036 商務旅行

時間限制: 1 s

空間限制: 128000 kb

題目等級 :鑽石 diamond

傳送門題目描述 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 資料範圍及提示 data size & hint

分類標籤 tags

最近公共祖先 圖論 並查集 線段樹 樹結構

/*

fa[i][j]表示第i個點向上找2^j次所對應的點.

所謂原理:2的冪可以組合成任意自然數(包括質數).

*/#include

#include

#include

#define maxn 30001

#define d 20

using

namespace

std;

struct data

e[maxn*2];

int tot,deep[maxn],fa[maxn][d+5],n,m,head[maxn];

void add_edge(int u,int v)

void dfs(int now,int father,int d)//建樹.

}}void get_father()//處理出每個節點的2^j.

int get_same(int a,int b)//二進位制使u,v在同一深度.

int lca(int u,int v)

return fa[u][0];//此時u為lca的子節點.

}int main()

dfs(1,1,0);

get_father();

int u,v;

tot=0;

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

for(int i=1;iscanf("%d",&v);

int lca=lca(u,v);

tot+=(deep[u]+deep[v]-2*deep[lca]);//數學方法.

u=v;

}printf("%d",tot);

return

0;}

/*

離線tarjan+並查集.

第一次打模板wrong了.

然後火急火燎找了半小時錯誤.

關於鄰接鍊錶邊的標號的初始化問題.

若第一條邊標號為0則需初始化head[1~n]=-1,

因為搜尋的時候必定會搜到head[u]==0

然後需判i!=-1

若第一條邊編號為1則只需判i!=0

無需初始化.

切記.

*/#include

#include

#include

#define maxn 50001

using

namespace

std;

int n,m,head[maxn],ans,fa[maxn],lc[maxn],tot,cut,deep[maxn],head2[maxn];

bool b[maxn],b2[maxn];

struct data

e[maxn<<1],s[maxn<<1];

void add_edge(int u,int v)

void add(int u,int v)

void dfs(int x,int father)

}int find(int x)

void lcatarjan(int u)

for(int i=head2[u];i;i=s[i].next)

}b2[u]=true;

}int main()

int u=1,v;

scanf("%d",&m);

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

dfs(1,0);

memset(b,0,sizeof(b));

lcatarjan(1);

printf("%d",ans);

return

0;}

CodeVS1036 商務旅行

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

Codevs 1036 商務旅行

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

Codevs 1036 商務旅行

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