码迷,mamicode.com
首页 > 其他好文 > 详细

【最短路/最大生成树】POJ 1797 Heavy Transportation

时间:2020-05-23 13:22:58      阅读:49      评论:0      收藏:0      [点我收藏+]

标签:ges   ati   poj   https   else   tor   return   net   line   

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

标签:ges   ati   poj   https   else   tor   return   net   line   

原文地址:https://www.cnblogs.com/streamazure/p/12941864.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!