201703-4 地铁修建
使用并查集,当能够使1和n在同一个连通块的时候
就可以退出,又因为是求最长时间,也就是当前这个子生成树的最大边
也就是刚好使得1和n联通时加入的那条边的边权
使用克鲁斯塔尔算法即可
#include<bits/stdc++.h>
using namespace std;
int ans = 0;
vector<pair<int, pair<int, int> > > edge;
int fa[100010];
int find(int x){
return fa[x]==0? x: fa[x]=find(fa[x]);
}
int main(){
ios::sync_with_stdio(false);
int n, m;
cin>>n>>m;
int x,y,p;
edge = vector<pair<int, pair<int, int> > >(m);
for(int i=0; i<m; i++){
cin>>x>>y>>p;
edge[i]=make_pair(p, make_pair(x,y));
}
sort(edge.begin(), edge.end(), [](pair<int, pair<int, int> > a,pair<int, pair<int, int> > b){return a.first<b.first;
});
int cnt=0;
for(auto e:edge){
int fa1 = find(e.second.first);
int fa2 = find(e.second.second);
if(fa1==fa2)
continue;
cnt++;
ans = e.first;
fa[fa2] = fa1;
if(find(1)==find(n)) break;
if(cnt==n-1) break;
}
cout<<ans<<endl;
return 0;
}
一条有梦想的咸鱼