并查集+模拟
2024-05-18 21:14:02
发布于:上海
49阅读
0回复
0点赞
题意简述
给定 个点和 条无向边,每条边有一个出现时间戳,问图最早在什么时候连通。
显然,只需按时间戳对边排序,再使用并查集维护图的连通性,逐次将边加入并查集即可。
并查集用于处理一些不相交集合的合并及查询问题。不知道并查集的可以前往这道题哦!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iomanip>
#include <queue>
using namespace std;
struct r{
int x,y,t;
}q[100005];
int f[100005],n,m;
int find(int x){
if(x!=f[x]) f[x] = find(f[x]);
return f[x];
}
inline void merge(int x, int y){
int fx=find(x), fy=find(y);
if(fx!=fy) f[fx] = fy,n--;
}
bool cmp(r x, r y){
return x.t<y.t;
}
int main(){
cin >> n >> m;
for(int i=1; i<=n; i++) f[i]=i;
for(int i=1; i<=m; i++) cin >> q[i].x >> q[i].y >> q[i].t;
sort(q+1, q+m+1, cmp);
for(int i=1; i<=m; i++){
merge(q[i].x, q[i].y);
if(n==1){cout<<q[i].t;return 0;}
}
cout << -1;
return 0;
}
这里空空如也
有帮助,赞一个