LCA 倍增 貨物運輸 upcexam5909

2022-09-07 09:45:10 字數 1841 閱讀 1170

時間限制: 1 sec 記憶體限制: 128 mb

題目描述

在一片蒼茫的大海上,有n座島嶼,島嶼與島嶼之間由橋梁連線,所有的島嶼剛好被橋梁連線成乙個樹形結構,即共n-1架橋梁,且從任何一座島嶼出發都能到達其他任何一座島嶼。

第i座橋梁有乙個承重量wi,表示該橋梁一次性最多通過重量為wi的貨物。

現在有m個貨物運輸路線,第i個路線要從島嶼xi出發到達島嶼yi。為了最大化利益,你需要求出在不超過路線上任何一架橋梁的承重量的基礎上,每個路線最多運輸重量為多少貨物。

輸入 第一行為兩個整數n,m。

接下來n-1行,每行三個整數x,y,w,表示有一座承重量為w的橋梁連線島嶼x和y。

接下來m行,每行兩個整數x,y,表示有一條從島嶼x出發到達島嶼y的路線,保證x≠y。

輸出 輸出共m行,每行乙個整數,第i個整數表示第i條路線的最大重量。

樣例輸入

6 5

1 2 2

2 3 5

2 4 2

2 5 3

5 6 1

2 4

6 2

1 3

3 5

1 6

樣例輸出

2 1

2 3

1 提示

島嶼間連線情況如圖所示:

2,4間只有一架橋,該路線最大運輸重量為2

6,2間有兩架橋,承重分別為3和1,該路線最大運輸重量為1

剩餘詢問不再作解釋

對於50%的資料n,m<=2000

對於100%的資料 n,m<=100000,w<=10^9

** 2018山東冬令營

思路 第一次寫倍增求lca

這一題每次查詢的兩個點 x,y

可以考慮倍增求這兩個點的lca

用g[i][j]表示從i到i的第2^j個祖先的所經過的路的最小權值

維護時 g[i][j]=min( g[i][j-1] , g[ f[i][j-1] ][j-1] )

當x或y向根節點移動時,將對應路徑上的最小值與答案取min

**

#define file() freopen("../../in.txt","r",stdin)

#include

using namespace std;

const

int maxn = 100005;

const

int maxl = 20;

const

int inf = 0x3f3f3f3f;

int anc[maxn][maxl],fa[maxn],deep[maxn],n,m,cnt,head[maxn];//anc記錄祖先,fa記錄父親節點,deep記錄深度

int g[maxn][maxl];

struct edgeed[maxn*2];

void addedge(int u,int v,int w)

void dfs(int x)

for(int i=head[x];i;i=ed[i].nex)

}}int lca(int x,int y)

}// if(x==y)return x;

for(int i=maxl-1;i>=0;i--)

}if(x!=y)

return ret;

}int main()

for(int i=0;ifor(int j=0;j1);

for(int i=0;iint x,y;

scanf("%d%d",&x,&y);

printf("%d\n",lca(x,y));

}return

0;}

HDU 5699 貨物運輸

problem description 公元2222年,l國發生了一場戰爭。小y負責領導工人運輸物資。其中有 m 種物資的運輸方案,每種運輸方案形如 l i,ri 表示存在一種貨物從 l i 運到 r i 這裡有 n 個城市,第 i 個城市與第 i 1個城市相連 這裡 1 號城市和 n 號城市並不相...

51Nod 1671 貨物運輸

acm模版 官方題解 首先我們需要注意到最重要的一點,所有運輸方案同時進行,我們只需要計算最後到達的方案的花費時間的最小值。所以我們需要考慮的是乙個極限情況,在這個極限情況下,其他運輸方案全部是在允許範圍內的。所以我們可以二分列舉這個極限情況,判斷所有方案是否都在這個極限內,在的話就繼續縮小極限,不...

51nod 1671 貨物運輸

公元2222年,l國發生了一場戰爭。小y負責領導工人運輸物資。其中有m種物資的運輸方案,每種運輸方案形如li,ri。表示存在一種貨物從li運到ri。這裡有n個城市,第i個城市與第i 1個城市相連 這裡1號城市和n號城市並不相連 並且從i號城市走到i 1號或者從i 1號走到i號需要耗費1點時間。由於高...