最短路/最大生成树POJ 1797 Heavy Transportation
Posted streamazure
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路/最大生成树POJ 1797 Heavy Transportation相关的知识,希望对你有一定的参考价值。
题意:给一个无向图,找出在所有从结点(1)到结点(n)的路径中,最小边的权值最大的那一条。输出这个权值。
思路:
方法有两种:一是最短路变形,二是最大生成树。
这里先给出最大生成树的代码。最大生成树可以保证生成“最小边的权值最大的那一条路径”,又因为在生成过程中,边的权值顺序是从大到小的,所以能使结点(1)到结点(n)连通的最后那一条边就是题目所求的“最小边”。只要结点(1)到结点(n)有通路就可以跳出,不要生成整棵树。
注意这里在结构体Edge中重载了<运算符,规定权值较大的边比较小。而sort函数是默认从小到大排的,sort之后边的顺序其实是按权值从大到小。
int n, m;
int p[maxn];
int find(int x) { return p[x] == x ? x : p[x] = find(p[x]); }
struct Edge {
int from, to;
LL dis;
bool operator < (const Edge& t) const { return dis > t.dis; }
}Edges[maxn * maxn];
void solve() {
n = read(); m = read();
for (int i = 0; i <= n; i++) p[i] = i;
int ans = 0;
for (int i = 1; i <= m; i++) {
int u, v;
LL d;
u = read(); v = read(); d = read();
Edges[i].from = u;
Edges[i].to = v;
Edges[i].dis = d;
}
sort(Edges + 1, Edges + 1 + m);
for(int i=1;i<=m;i++) {
Edge& e = Edges[i];
int x = find(e.from);
int y = find(e.to);
if (find(1) != find(n)) {
ans = e.dis;
p[x] = y;
}
else break;
}
cout << ans << endl << endl;
}
以上是关于最短路/最大生成树POJ 1797 Heavy Transportation的主要内容,如果未能解决你的问题,请参考以下文章
poj1797 Heavy Transportation(最短路变形)
POJ 1797 Heavy Transportation (最大生成树)
(POJ 1797) Heavy Transportation 最大生成树
POJ-1797 Heavy Transportation(最大生成树)