题目描述
Bessie 计划调查 N(2≤N≤2000)个农场的干草情况,它从 1 号农场出发。农场之间总共有 M(1≤M≤10^4)条双向道路,所有道路的总长度不超过 10^9。有些农场之间存在着多条道路,所有的农场之间都是连通的。
Bessie 希望计算出该图中最小生成树中的最长边的长度。
输入格式
第一行两个整数 N,M。
接下来 M 行,每行三个用空格隔开的整数Ai,Bi,Li,表示 Ai,Bi 之间有一条道路,长度为 Li。
输出格式
一个整数,表示最小生成树中的最长边的长度。
输入输出样例
输入 #1复制
3 3 1 2 23 2 3 1000 1 3 43输出 #1复制
43
代码:
#include <bits/stdc++.h>
using namespace std;
int n,m;
pair<int,pair<int,int>> sn[1000010];
int anc[1000010];
int find(int x){//并查集
if(anc[x]!=x) anc[x]=find(anc[x]);
return anc[x];
}
int maxn=0;
void kruskal(){//模板小改
for(int i = 1;i<=n;i++) anc[i]=i;
for(int i = 1;i<=m;i++){
int a=sn[i].second.first,b=sn[i].second.second,c=sn[i].first;
int t1=find(a),t2=find(b);
if(t1!=t2){
anc[t1]=t2;
maxn=max(maxn,c);
}
}
cout << maxn;
}
int main(){
cin >> n >> m;
for(int i = 1;i<=m;i++){
int a,b,l;
cin >> a >> b >> l;
sn[i]={l,{a,b}};
}
sort(sn+1,sn+m+1);
kruskal();
return 0;
}