最小生成树+并查集

#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);
    }
}

 

posted @ 2022-02-04 23:25  九点的日落  阅读(56)  评论(0)    收藏  举报