P1967 貨車運輸

2022-05-16 00:58:45 字數 1484 閱讀 3955

\(a\)國有\(n\)座城市,編號從\(1\)到\(n\),城市之間有\(m\)條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有

\(q\)輛貨車在運輸貨物, 司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。

第一行有兩個用乙個空格隔開的整數\(n\),\(m\)表示 \(a\) 國有\(n\)座城市和\(m\)條道路。

接下來\(m\)行每行3個整數\(x\),\(y\),\(z\)每兩個整數之間用乙個空格隔開,表示從\(x\)號城市到\(y\)號城市有一條限重為z的道路。注意:\(x\)不等於 \(y\),兩座城市之間可能有多條道路。

接下來一行有乙個整數 \(q\),表示有 $q $輛貨車需要運貨。

接下來 \(q\) 行,每行兩個整數 \(x\)、\(y\),之間用乙個空格隔開,表示一輛貨車需要從 \(x\) 城市運輸貨物到\(y\)城市。

輸出格式

共有\(q\)行,每行乙個整數,表示對於每一輛貨車,它的最大載重是多少。如果貨車不能到達目的地,輸出\(−1\)。

輸入輸出樣例

4 31 2 4

2 3 3

3 1 1

31 3

1 41 33-1

3對於30%的資料,\(0

對於 60%的資料,\(0

對於 100%的資料,\(0

我們通過構造kruskal重構樹,在樹上查詢兩點lca的點權值,即為答案。

關於kruskal重構樹操作

如將邊權按降序排序

則lca(u,v)的權值代表 原圖 u到v路徑上最大邊權的最小值

如將邊權按公升序排序

則lca(u,v)的權值代表 原圖 u到v路徑上最小邊權的最大值

#includeusing namespace std;

const int maxn=200000+100,maxm=200000+100,md=20+5;

int head[maxn],val[maxn],f[maxn],dep[maxn],lg[maxn];

int ff[maxn][md];

int size=0,cnt=0;

struct tree

e[maxm<<1];

struct edge

e[maxm<<1];

int n,m;

void init()

int find(int x)

void addedge(int u,int v)

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}bool cmp(const edge&a,const edge&b)

void kruskal()

}}void dfs(int u,int fa)

}int lca(int x,int y)

int main()

return 0;

}

P1967 貨車運輸

題目 題目描述 aa國有n n座城市,編號從 1 1到 nn,城市之間有 mm 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 qq 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。輸入格式 第一行有兩個用乙個空格隔開的整數 n,mn,m,表示 aa 國...

P1967 貨車運輸

a 國有 n 座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。第一行有兩個用乙個空格隔開的整數 n,m,表示 a 國有 n 座城市和 m 條道 路。接下來 m...

P1967 貨車運輸

emmmm一開始是想到網路流來著?最大流嘛233 然後發現自己好像已經差不多忘完了?於是開啟題解,ctrl f,輸入網路流,好像沒有題解,於是就老老實實想正解去了。正解 多組詢問,想想網路流也要t ek本來就慢,其它就不說了 所以一定是還有更簡單的方法的!對於每乙個點 或者說路徑 只有最小的那個邊才...