标签:ges ati poj https else tor return net line
题意:给一个无向图,找出在所有从结点\(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
标签:ges ati poj https else tor return net line
原文地址:https://www.cnblogs.com/streamazure/p/12941864.html