题目:给出A地区的村庄数NN,和公路数MM,公路是双向的。并告诉你每条公路的连着哪两个村庄,并告诉你什么时候能修完这条公路。问最早什么时候任意两个村庄能够通车,即最早什么时候任意两条村庄都存在至少一条修复完成的道路(可以由多条公路连成一条道路)
#include<bits/stdc++.h>
//并查集是与kruskal一起用的,最小生成树的做法,在以下一系列算法过后就已经生成了最优树
using namespace std;
struct node{
int x,y,t;
}e[10000]; //防止越界,按照题目要求,需要设置足够大的容量
bool operator < (node a,node b){return a.t<b.t;} //sort不认识结构体的比大小 因此需要进行运算符重载
int m,n,num,ans;
int parent[10000];
int find_root(int x)
{
int x_root=x;
while(parent[x_root]!=-1)
{
x_root=parent[x_root];
}
return x_root;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
parent[i]=-1; //这个数组的意义在于,他刚开始将所有的村庄看成孤立的点 并都当作根节点
}
for(int j=1;j<=m;j++)
{
scanf("%d%d%d",&e[j].x,&e[j].y,&e[j].t);
}
sort(e+1,e+1+m);
//注意次数的sort函数与上面的<重载
for(int i=1;i<=m;i++)
{
int x=find_root(e[i].x);
int y=find_root(e[i].y);
if(x==y)
continue;
//此处相等说明他们本来就相互连接,已经构成了环,如果此处不相等,则就应证了kruskal算法,从小到大找权值最小的边,直至构成最小生成树
else
{
parent[x]=y; //把x节点作为y的根节点
num++;
ans=max(ans,e[i].t);
}
}
if(num!=n-1)
printf("-1");
else{
printf("%d\n",ans);
}
}