\(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本來就慢,其它就不說了 所以一定是還有更簡單的方法的!對於每乙個點 或者說路徑 只有最小的那個邊才...