P1111 修复公路(并查集)

题意:

给你n个点,m条无向边,每条边建好都有一个时间,问什么时候各个点能互相可达

思路:

将每条边按时间排序,每次加入一条边,看边连接的两点是否在一个连通块内,不在的话合并连通块,看是否总连通块个数为1即可

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
 using namespace std;
 const int maxn1=1e5+10;
 const int maxn2=1e3+10;
 int fa[maxn2],siz[maxn2],n,m;
 struct node{
     int u,v,t;
 }edge[maxn1];
 int cmp(node a,node b){return a.t<b.t;}
 int find(int x){return fa[x]==x?x:(fa[x]=find(fa[x]));}
 int main()
 {
     scanf("%d%d",&n,&m);
     for(int i=0;i<m;i++) scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].t);
     sort(edge,edge+m,cmp);
    for(int i=1;i<=n;i++)    fa[i]=i;
    memset(siz,0,sizeof(siz));
    int cnt=n;
    for(int i=0;i<m;i++){
        int u=edge[i].u,v=edge[i].v,t=edge[i].t;
        int f1=find(u),f2=find(v);
        if(f1!=f2)    fa[f1]=f2,cnt--;
        if(cnt==1){
            cout<<t<<endl;
            return 0;
         }    
    }
    cout<<-1<<endl;
    return 0;
 }

猜你喜欢

转载自www.cnblogs.com/overrate-wsj/p/12285519.html