時間限制: 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點時間。由於高...