1. 程式人生 > >【CCF 201703-4】地鐵修建(Kruskal 貪心 並查集)

【CCF 201703-4】地鐵修建(Kruskal 貪心 並查集)

題目抽象

修建一條結點1到結點n的一條路,使得這條路上最大的邊權最小

思路

從Kruskal演算法得到啟示,將邊按權重排序,不斷地加入最短的邊,直到結點1到結點n連通即可

判斷是否連通的方法:使用並查集

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;
}