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;
}
posted @ 2020-09-08 21:49  CrosseaLL  阅读(82)  评论(0编辑  收藏  举报