【CCF 201703-4】地铁修建(Kruskal 贪心 并查集)

版权声明: https://blog.csdn.net/leelitian3/article/details/82712682

题目抽象

修建一条结点1到结点n的一条路,使得这条路上最大的边权最小

思路

从Kruskal算法得到启示,将边按权重排序,不断地加入最短的边,直到结点1到结点n连通即可

判断是否连通的方法:使用并查集

参考:【洛谷模板题 最小生成树】kruskal算法入门

C++代码

类似于Kruskal算法,只是结束条件不一样

#include <iostream>
#include <algorithm>
using namespace std;

int n,m,cnt=0;
int parent[100005];

struct Edge
{
	int a,b,len;
	bool operator < (const Edge& t)
	{
		return len < t.len;
	}
} e[200005];

inline int find_set(int x)
{
	return x == parent[x] ? x : parent[x] = find_set(parent[x]);
}

int main()
{
	cin>>n>>m;
	for(int i=0; i<m; ++i)
		cin>>e[i].a>>e[i].b>>e[i].len;
	sort(e,e+m);

	for(int i=1; i<=n; ++i)
		parent[i] = i;

	for(int i=0; i<m; ++i)
	{
		if(find_set(e[i].a) != find_set(e[i].b))
			parent[parent[e[i].a]] = parent[e[i].b];
			
		if(find_set(1) == find_set(n))
		{
			cout<<e[i].len;
			return 0;
		}
	}

	return 0;
}

猜你喜欢

转载自blog.csdn.net/leelitian3/article/details/82712682