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

Posted streamazure

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路/最大生成树POJ 1797 Heavy Transportation相关的知识,希望对你有一定的参考价值。

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(最大生成树)

Heavy Transportation POJ 1797 最短路变形

POJ-1797 Heavy Transportation( 最短路 )