题意:
给你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;
}
来源:https://www.cnblogs.com/overrate-wsj/p/12285519.html