本题其实是裸的Kruskal(~~其实我就是搜了并查集的标签~~)
根据题意可以得知,有n个点,m条边,我们就可以很自然的使用Kruskal的模板,最后判断集合的个数。
话不多说,上代码
#include<bits/stdc++.h>
using namespace std;
int n,m;//村庄数,公路数
int x,y,t,fat[1002],ans=0,k=0;
struct point{
int x,y,t;
}a[100002];
int cmp(const point &a,const point &b){return a.t<b.t;}//自定义比较函数
int father(int x){
if(fat[x]!=x)
fat[x]=father(fat[x]);
return fat[x];
}
void unionn(int x,int y){
int fa=father(x);
int fb=father(y);
if(fa!=fb)
fat[fb]=fa;
}
int main(){
// freopen("xfgl.in","r",stdin);
// freopen("xfgl.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&t);
a[i].x=x;
a[i].y=y;
a[i].t=t;
}
sort(a+1,a+1+m,cmp);
for(int i=1;i<=n;i++)
fat[i]=i;
for(int i=1;i<=m;i++)
if(father(a[i].x)!=father(a[i].y)){
unionn(a[i].x,a[i].y);
if(a[i].t>ans)
ans=a[i].t;
k++; //记录连接边的个数
}
if(k!=n-1)
ans=-1; //如果连接边的个数不等于n-1,说明不止一个集合,即仍然存在两个村庄无法通车
printf("%d\n",ans);
// fclose(stdin);
// fclose(stdout);
return 0;
}