版权声明: https://blog.csdn.net/leelitian3/article/details/82712682
题目抽象
修建一条结点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;
}