图的最小生成树---克鲁斯卡尔(Kruskal)算法_riba2534的博客-程序员秘密

技术标签: 最小生成树  【并查集/欧拉路/最小生成树】  kruskal  

关于Kruskal算法,这里有一篇博客:最小生成树之Kruskal算法,我总结一下重点:

这是最小生成树的另一种算法,要求总长度之和最短,那么先把图的路径的权值从小到大排列一下,最终连成n-1条边。按照排列好的顺序依次连线,在连线的过程中可能遇到有些点已经联通了,这时我们需要用上并查集来判断两个顶点是否已经连通。

给一组测试数据:

输入:

6 9  
2 4 11  
3 5 13  
4 6 3  
5 6 4  
2 3 6  
4 5 7  
1 2 1  
3 4 9  
1 3 2  

输出:

19

代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <string>
#include <iostream>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define N 100+20
#define M 100000+20
#define MOD 1000000000+7
#define inf 0x3f3f3f3f
using namespace std;
struct node
{
    int u;
    int v;
    int w;
} map[10];
int n,m;
int f[7]= {0},sum=0,cnt=0; //并查集用
int getf(int v)//并查集查找祖先
{
    if(f[v]==v)
        return v;
    else
    {
        //路径压缩
        f[v]=getf(f[v]);
        return f[v];
    }
}
//并查集合并两个子集
int mix(int v,int u)
{
    int t1,t2;
    t1=getf(v);
    t2=getf(u);
    if(t1!=t2)//判断两个点是否在同一个集合中
    {
        f[t2]=t1;
        return 1;
    }
    return 0;
}
bool cmp(node x,node y)
{
    return x.w<y.w;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1; i<=m; i++)
        scanf("%d%d%d",&map[i].u,&map[i].v,&map[i].w);
    sort(map+1,map+m+1,cmp);
    //并查集初始化
    for(int i=1; i<=n; i++)
        f[i]=i;
    //克鲁斯卡尔(Kruskal)算法的核心内容
    for(int i=1; i<=m; i++) //从小到大枚举边
    {
        //判断一条边的两个顶点是否联通,就是判断是否在同一个集合中
        if(mix(map[i].u,map[i].v))//没有连通的话就选用这条边
        {
            cnt++;
            sum+=map[i].w;
        }
        if(cnt==n-1)//选了n-1条边后退出循环
            break;
    }
    printf("%d",sum);
    return 0;
}


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/riba2534/article/details/60151155

智能推荐

[ZT]《让我们一起CCNA吧》系列文章四:CISCO IOS介绍_cisco ios路由器和交换机能够执行或支持的主要功能_u014461454的博客-程序员秘密

现在是介绍思科网络操作系统的时候了,Cisco Internetwork OperatingSystem简称IOS,它在思科的路由器和交换机上运行,它还能让你在上面执行配置操作。在本章你将能够学习到怎样通过初始安装模式和Cisco IOS command-line interface (CLI)来配置思科的路由器。这里是一些本章我们要达到的目标:·关于IOS的介绍和配置·连接一个路由器·启动路由器

为什么你作为一个.NET的程序员工资那么低?_weixin_30273931的博客-程序员秘密

最近看到很多抱怨贴,也许有一定的道理,但是你想过没,为什么大部分.NET程序员工资相对低?我个人是这么看的:大批半罐子水的程序员,永远被局限在.NET的原始的小圈圈里。前端不会(你放弃了一项很重要的技术),SQL写不好(那估计你的业务能力也就一般,项目管理或者业务方面看来发展前景不大好),Linq也用不来(看来你连.NET的东西都没玩好,而且你错过了一个开发效率极高的东东),Sh...

xorm reverse mysql_golang xorm reverse 自动生成数据库实体文件_臭鼠标的博客-程序员秘密

一、先安装好需要的东西go get github.com/go-xorm/cmd/xorm安装驱动版本,选择自己需要用的go get github.com/go-sql-driver/mysql //Mysqlgo get github.com/ziutek/mymysql/godrv //MyMysqlgo get github.com/lib/pq //Postgresgo get gi...

linux进系统黑屏,kail-linux 进入系统时黑屏_我不是闸总的博客-程序员秘密

以为这个错误,耽误了我期末复习的时间。出现这个现状是因为双显卡驱动不兼容导致的。Nouveau 是一个开源的显卡驱动,它会影响NUIDIA驱动的安装跳过运行nouveau 驱动就可以了这里是实际操作:在引导界面按e进行编辑,出现上图(上图来自:https://blog.csdn.net/qq_36629313/article/details/79980763)在quiet 后面加上nouveau....

【STM32】I2C_i2c_acknowledgeconfig_sunshine42.7的博客-程序员秘密

是一种支持多主机多从机的半双工 、同步、串行、低速通讯方式。多用于芯片间通讯。I²C全称叫 Inter-Integrated Circuit,字面上的意思是集成电路之间,它其实是I²C Bus简称。

黑马程序员-基础部分(1_逆风鸟不飞的博客-程序员秘密

--------------------android培训、java培训、期待与您交流! --------------------j2ee,j2se,j2me (中2的意思是版本2.0),5.0之后更名为JAVAEE,JAVASE,JAVAME, java的版本1.0/ 1.1 / 1.2 / 1.3 / 1.4 / 5.0 /6.0/*2012年4月30日19:42:32hell

随便推点

Unity2D 背景图铺满与Camera.Size的计算公式_weixin_34221775的博客-程序员秘密

在unity制作2D游戏的教程,背景图sprite铺满显示时Camaer的Size调到多少合适,作个笔记。资源参数background.png 2048x640,Sprite的像素单位:100调节camera.size当camera的size=5,背景的显示效果Camera的Size=3.2的背景的显示效果 计算公式 计算公式为:Screen Heigh...

java生成word目录_Apache POI自动生成Word文档(带目录)_李赔十学长的博客-程序员秘密

1 什么是Apache POI2 Apache POI的组件3 安装Apache POI4 使用POI操作Word文档1 什么是Apache POI全称Apache POI,使用Java编写的免费开源的跨平台的Java API。 是创建和维护操作各种符合 Office Open XML(OOXML)标准和微软的 OLE 2 复合文档格式(OLE2)的 Java API。用它可以使用 Java 读...

appium定位HTML,appium定位H5页面_雪鱼子的博客-程序员秘密

手机端由原生切换为H5,定位不到元素。需要将apk开启调试模式:在入口Activity中添加2行代码,如下if (Build.VERSION.SDK_INT &gt;=Build.VERSION_CODES.KITKAT) {WebView.setWebContentsDebuggingEnabled(true);}效果如下:protected void onCreate(Bundle saved...

软件工程导论张海蕃书籍pdf_《软件工程导论》张海蕃 课后习题答案_weixin_39731782的博客-程序员秘密

1第一章1-1什么是软件危机?是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。1-3什么是软件工程?是指导计算机软件开发和维护的一门工程学科。1-4简述结构化范型和面向对象范型的要点,并分析它们的优缺点。目前使用得最广泛的软件工程方法学(2种):1.传统方法学:也称为生命周期方法学或结构化范型。优点:把软件生命周期划分成基干个阶段,每个阶段的任务相对独立,而且比较简单,便于不同人员分工协...

fcm算法matlab实现,fcm算法matlab_布博士的博客-程序员秘密

7,4 3 fcm 函数源代码(在 MATLAB 中输入 type fcm 可以...模糊C均值聚类matlab代码... 暂无评价 3页 免费 模糊聚类分析算法的MATL... 2页 2下载券 模糊c均值聚类+FCM算法的... 9页 2下载券 喜欢......K-means算法matlab的实现_数学_自然科学_专业资料。算法流程图开 始...17遗传算法改进的模糊C-均值聚类MAT...

PAT 甲级 1136 A Delayed Palindrome (20 分)_Yuhan の Blog的博客-程序员秘密

思路:1.用数组保存这个超级大的数字,每个位置存一位;2.用循环每一位相加,进位就做标记,下一次加的时候多+1;3.最后循环出来检查标记位,如果有标记则最高位再放一个1;代码:#include&lt;iostream&gt;#include&lt;vector&gt;#include&lt;algorithm&gt;using namespace std;vector&lt;in...

推荐文章

热门文章

相关标签