洛谷 P1967 貨車運輸 生成樹 LCA

2022-05-08 01:21:08 字數 2404 閱讀 5665

洛谷 p1967 貨車運輸

演算法標籤:圖論生成樹深度優先搜尋(dfs)

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 城市,注意: ** x 不等於 y ** 。

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

輸入 #1

4 3

1 2 4

2 3 3

3 1 1

31 3

1 41 3

輸出 #1

3

-13

生成樹(最大)+ dfs + 倍增lca

整體思路就是在最大生成樹上找一條最小邊,實現的過程就是在最大生成樹上跑倍增lca。

那麼既然這麼說,我們就要單獨把最大生成樹建好(除去多餘邊),所以我們就需要在kruskal的時候直接建樹,具體**實現:

void kruskal()

for (int i = 1; i <= m; i ++ ) }

}

在建好最大生成樹之後,我們要dfs做幾個處理:

1.處理出每個點的深度(lca)

2.處理好每個點的上1個點(lca)

3.處理好每個點到它的上乙個點的距離(lca邊權)

**實現如下:

void dfs(int x)

}

最終求答案就是乙個倍增lca的板子,要注意在每一步向上倍增的時候都要記錄答案(最小邊邊權)

ans = min(ans, min(w[x][i], w[y][i]));

最終的ans就是對於這一對詢問的答案。

lca部分**如下:

int lca(int x, int y)

} if (x == y) return ans;

for (int i = 20; i >= 0; i -- ) }

ans = min(ans, min(w[x][0], w[y][0]));

return ans;

}

#include using namespace std;

const int inf = 0x3f3f3f3f;

const int maxn = 10010;

const int maxm = 50050;

int n, m, q;

int fa[maxn], deep[maxn], f[maxn][21], w[maxn][21];

int tot, to[maxm], val[maxm], nex[maxm], head[maxn];

struct edge edge[maxm];

bool cmp(edge a, edge b)

int find(int x)

void add(int x, int y, int z)

void kruskal()

for (int i = 1; i <= m; i ++ ) }

}void dfs(int x)

}int lca(int x, int y)

} if (x == y) return ans;

for (int i = 20; i >= 0; i -- ) }

ans = min(ans, min(w[x][0], w[y][0]));

return ans;

}int main()

kruskal();

scanf("%d", &q);

for (int i = 1; i <= n; i ++ ) }

for (int i = 1; i <= 20; i ++ ) }

for (int i = 1; i <= q; i ++ )

return 0;

}

洛谷 P1967 貨車運輸

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

洛谷 P1967 貨車運輸

題目描述 a 國有 n 座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。輸入輸出格式 輸入格式 輸入檔名為 truck.in。輸入檔案第一行有兩個用乙個空格隔...

貨車運輸 洛谷p1967

解法一 30分 直接跑spfa,求最大瓶頸路。include include include define f i,l,r for i l i r i using namespace std const int maxn 10005,maxm 50005,inf 100000000 struct e...