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