P1967 貨車運輸 Kruskal重構樹

2021-09-20 04:01:41 字數 1963 閱讀 5498

題目描述

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...