题意:
给你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; }