首页 > 其他 > 详细

并查集模板

时间:2019-01-30 20:22:37      阅读:150      评论:0      收藏:0      [点我收藏+]

//这么简单的东西我就不废话了,具体看代码<br data-filtered="filtered">#include<iostream>

#include<queue>
#include<cstdio>
using namespace std;
 
int n,m,fa[110],ans;//fa数组记录fa【i】的根;
 
struct str{
 
    int x,y,s; //x——起点,y——终点,s——权值;
 
}u[110];
 
int find(int x){ //寻找根;
 
    if(fa(x)==x) return x;
 
    else return fa(x)=find(fa(x));
 
}
 
bool cmp(str x,str y){ //结构体排序 ;
 
    return x.s<y.s;
 
}
 
int main(){
 
    scanf("%d%m",&n,&m);
 
    for(int i=1;i<=m;i++){
 
    scanf("%d%d%d",&u[i].x,&u[i].y,&u[i].s);
 
    }
 
    for(int i=1;i<=n;i++) fa[i]=i; //初始化根 ;
 
    sort(u+1,u+m+1,cmp);
 
    q=1;
 
    for(int i=1;i<=m;i++){
 
    int fx=find(u[i].x); //寻找起点的根 ;
 
    int fy=find(u[i].y); //寻找终点的根;
 
    if(fx!=fy){ //如果不是同一个根,将两个不同的集合合并,(将fx的根付给fy也行)如:
 
    fa[fx]=fy; //fa【fy】=fx;
 
    ans+=u[i].s; //加上权值
 
    q++; //记录链接的边
 
    }
 
    if(q==n) break;
 
    }
 
    printf("%d",ans);
 
    return 0;
 
}

并查集模板

原文:https://www.cnblogs.com/noifish/p/10339612.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!