其实,把村庄想成点,道路想成边,就变成了图论但不需要建图
然后就是并查集与最小生成树
先把道路按照时间排序,然后一个一个合并,最后一条道路(即第n-1条)要用的时间就是答案
但是!注意如果所有道路全都判断了一遍还不行,记得输出-1!
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
int fa[1007];//并查集,保存祖先
struct node{
int a,b;//两点
int time;//时间
}dl[100007];//保存边
int sum;//已连接的边数
int fi(int x){
if(fa[x]!=x)fa[x]=fi(fa[x]);
return fa[x];//找最老的祖先
}
void hb(int x,int y){
fa[x]=y;
return;//合并
}
bool cmp(node x,node y){
return x.time<y.time;//按时间排序
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
fa[i]=i;//先把祖先设为自己
for(int i=1;i<=m;i++)
cin>>dl[i].a>>dl[i].b>>dl[i].time;//读入
sort(dl+1,dl+m+1,cmp);//排序
for(int i=1;i<=m;i++){
int x=dl[i].a;
int y=dl[i].b;//取出连接的两点
if(fi(x)!=fi(y)){//如果不在同一个集合里
hb(fi(x),fi(y));//合并
sum++;//连接的边数加一
}
if(sum==n-1){//全都连接了
cout<<dl[i].time<<endl;//最后一条道路要用的时间
return 0;
}
}
cout<<-1<<endl;//不行,记得输出
return 0;
}