題目描述
a國有n座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q 輛貨車在運輸貨物, 司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。
輸入輸出格式
輸入格式:
第一行有兩個用乙個空格隔開的整數n,m,表示 a 國有 n 座城市和 m 條道路。
接下來 mm行每行 3 3個整數 x, y, z,每兩個整數之間用乙個空格隔開,表示從 x 號城市到 y 號城市有一條限重為 z 的道路。注意: x 不等於 y,兩座城市之間可能有多條道路 。
接下來一行有乙個整數 q,表示有 q 輛貨車需要運貨。
接下來 q 行,每行兩個整數 x、y,之間用乙個空格隔開,表示一輛貨車需要從 x 城市運輸貨物到 y 城市,注意: x 不等於 y 。
輸出格式:
共有 q 行,每行乙個整數,表示對於每一輛貨車,它的最大載重是多少。如果貨車不能到達目的地,輸出-1。
題意:一條路徑的值為該路徑的中所有邊中的最小值,求a->b的所以路徑中最大值
思路:kruskal重構樹 + lca
#include
using
namespace std;
const
int maxn =
1e6+5;
int head[maxn]
, top[maxn]
, father[maxn]
;int son[maxn]
, size[maxn]
, depth[maxn]
;int fa[maxn]
, val[maxn]
, l[maxn]
, r[maxn]
, vis[maxn]
;int n, m, q, u, v, tot, cnt, index;
struct node
}a[maxn]
;struct edge edge[maxn]
;int
find
(int x)
void
init()
void
add(
int u,
int v)
void
dfs1
(int u,
int fa)
dfs1
(to, u)
; size[u]
+= size[to];if
(size[to]
> maxson)}}
void
dfs2
(int u,
int topf)
for(
int i = head[u]
; i !=-1
; i = edge[i]
.next)
dfs2
(to, to);}
r[u]
= index;
}int
lca(
int x,
int y)
x = father[top[x]];
}if(depth[x]
> depth[y]
)return x;
}void
kruskal()
sort
(a +
1, a + m +1)
;for
(int i =
1; i <= m; i++)}
for(
int i=
1;i<=cnt;
++i)}}
intmain()
kruskal()
; cin >> q;
while
(q--
) cout << val[
lca(u, v)
]<< endl;
}return0;
}
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 貨車運輸
a 國有 n 座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。第一行有兩個用乙個空格隔開的整數 n,m,表示 a 國有 n 座城市和 m 條道 路。接下來 m...