题目大意:给定一个无向简单图,有
n
n
n个点,
m
m
m条边,选择若干条路径构建隧道使得从
1
1
1到
n
n
n连通,隧道建设需要时间,即边的权值,求
1
1
1到
n
n
n连通需要至少时间。
本题与最小生成树思路相似,与之不同的最小生成树的结束条件是当图中所有的点都在树上,而题的结束条件应当是第一个点和最后一个点连通,其他点是否连通并不重要。所以我们改变结束条件,可以使用Kruscal算法,从小到大对边排序,在构建生成树时就可以找到从
1
1
1到
n
n
n连通至少需要的长度(时间)。
#include<bits/stdc++.h>
using namespace std;
struct node
{
int u,v,w;
}a[200010];
int f[100010];
int n,m,maxx=-99999,ans=0,s;
bool cmp(node x,node y)
{
return x.w<y.w;
}
int find(int k)
{
if(k==f[k])return k;
else return f[k]=find(f[k]);
}
void kus()
{
for(int i=1;i<=m;i++)
{
int U=find(a[i].u);
int V=find(a[i].v);
if(U==V)continue;
if(find(1)==find(n))break;
maxx=max(maxx,a[i].w);
ans++;
if(U!=V)f[U]=V;
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1;i<=m;i++)cin>>a[i].u>>a[i].v>>a[i].w;
sort(a+1,a+m+1,cmp);
kus();
cout<<maxx<<endl;
return 0;
}