Kruskal算法的简单实现
嘛嘛嘛,好像大家在实现Kruskal算法是都是用的边集数组,判断图的连通性咱不会,o(╯□╰)o(并查集诶)。
Kruskal算法:
规则:
(1)对每一条边按照从小到大进行排序。
(2)加入边的时候判断这条边与之前的边是否构成回路,如果构成则放弃这条边,否则就加入到最小生成树中。
边集数组:
struct Edge{
    int begin;
    int end;
    int weight;
};
起点,终点,权值,这些都好懂的。
然后判断是否构成回路则是采用了并查集的思想:大家如果不懂并查集,可以看看这篇博客:并查集详解这篇博文,当初就是看这篇博文入门的。
整个代码:
#include <algorithm>
#include <iostream>
using namespace std;
const int MAXSIZE=; struct node{
int begin;
int end;
int weight;
}Gnode[MAXSIZE]; int parent[MAXSIZE]; int Parent(int f){
while(parent[f]!=f){
f=parent[f];
}
return f;
}
int cmp(node s1,node s2){
return s1.weight<s2.weight;
}
void Kruskal(node p[],int k){
int n,m;
for(int i=;i<=MAXSIZE;i++){
parent[i]=i;
}
sort(p,p+k,cmp);
for(int i=;i<=k;i++){
n=Parent(p[i].begin);
m=Parent(p[i].end);
if(n!=m){
cout<<'V'<<p[i].begin<<" "<<'V'<<p[i].end<<" "<<p[i].weight<<endl;
parent[n]=m;
}
}
}
int main(){
cout<<"Kruskal算法求最小生成树"<<endl;
cout<<"请输入图的边数"<<endl;
int num;
cin>>num;
for(int i=;i<=num;i++){
cin>>Gnode[i].begin>>Gnode[i].end>>Gnode[i].weight;
}
cout<<"最小生成树的每条边级其权值"<<endl;
Kruskal(Gnode,num);
return ;
}
附上测试数据:

这是最后构建出的最小生成树。
并查集的思想很简单:首先判断两个点的父亲节点是否相同,不相同则让其中一个父亲节点成为另一个父亲节点的子节点,这样大家都在一个集合里了,如果最后加入的边首位节点都在一个集合里,显然这就构成回路了。
以上图为例: 1 3 parent[1]=1 parent[3]=3 则parent[1]=3 parent[3]=3
4 6 parent[4]=4 parent[6]=6 则parent[4]=6 parent[6]=6
2 5 parent[2]=2 parent[5]=5 则parent[2]=5 parent[5]=5
3 6 parent[3]=3 parent[6]=6 则parent[3]=6 parent[6]=6
2 3 parent[2]=5 parent[3]=6 则parent[5]=6 parent[3]=6
2 1 parent[2]=6 parent[1]=6 这样构成了回路
还有一点要强调的是上面代码中parent函数没有路径压缩这一过程,数据量比较大时,可能会超时,当然大家采用递归写法的话就不用考虑这个问题了。
int Parent(int f){
    if(parent[f]!=f)
       parent[f]=Parent(parent[f]);
    return parent[f];
}
Kruskal算法的简单实现的更多相关文章
- 数据结构:最小生成树--Kruskal算法
		
Kruskal算法 Kruskal算法 求解最小生成树的还有一种常见算法是Kruskal算法.它比Prim算法更直观.从直观上看,Kruskal算法的做法是:每次都从剩余边中选取权值最小的,当然,这条 ...
 - 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用
		
图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...
 - 最小生成树---Prim算法和Kruskal算法
		
Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...
 - 最小生成树问题---Prim算法与Kruskal算法实现(MATLAB语言实现)
		
2015-12-17晚,复习,甚是无聊,阅<复杂网络算法与应用>一书,得知最小生成树问题(Minimum spanning tree)问题.记之. 何为树:连通且不含圈的图称为树. 图T= ...
 - 最小生成树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind
		
最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind 最小支撑树树 前几节中介绍的算法都是针对无权图的,本节将介绍带权图的最小 ...
 - HDU1875——畅通工程再续(最小生成树:Kruskal算法)
		
畅通工程再续 Description相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当 ...
 - 转载:最小生成树-Prim算法和Kruskal算法
		
本文摘自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html 最小生成树-Prim算法和Kruskal算法 Prim算 ...
 - 最小生成树之Prim算法,Kruskal算法
		
Prim算法 1 .概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gr ...
 - 最小生成树之算法记录【prime算法+Kruskal算法】【模板】
		
首先说一下什么是树: 1.只含一个根节点 2.任意两个节点之间只能有一条或者没有线相连 3.任意两个节点之间都可以通过别的节点间接相连 4.除了根节点没一个节点都只有唯一的一个父节点 5.也有可能是空 ...
 
随机推荐
- 不想作死系列---virtualbox最小化安装centos6.5
			
背景: 最近已经重装了5个系统,实在不想折腾了.于是打算在虚拟机中安装所需环境. 系统版本: 宿主机:win7 virtualbox4.3.10 centos 6.5(final) 1.下载安装vir ...
 - mssql server 函数大全
			
一.字符转换函数1.ASCII()返回字符表达式最左端字符的ASCII 码值.在ASCII()函数中,纯数字的字符串可不用‘'括起来,但含其它字符的字符串必须用‘'括起来使用,否则会出错.2.CHAR ...
 - IOS开发小记-内存管理
			
关于IOS开发的内存管理的文章已经很多了,因此系统的知识点就不写了,这里我写点平时工作遇到的疑问以及解答做个总结吧,相信也会有人遇到相同的疑问呢,欢迎学习IOS的朋友请加ios技术交流群:190956 ...
 - squid和varnish的小结
			
squid和varnish的小结 http://blog.haohtml.com/ 上周初步接触linux下的这2个反向缓存软件,都实验了一下,貌似squid还是比较顺利的,varnish则碰 ...
 - Kendo UI开发教程(8): Kendo UI 特效概述
			
Kendo UI Fx 提供了一个丰富,可扩展,性能经过优化的工具集合用来完成HTML元素的过渡显示.每种特效近可能的使用CSS Transition ,对于一些老版本浏览器使用修改属性的方法作为补充 ...
 - HDU 2073 无限的路
			
Problem Description 甜甜从小就喜欢画图画,最近他买了一支智能画笔,由于刚刚接触,所以甜甜只会用它来画直线,于是他就在平面直角坐标系中画出如下的图形: 甜甜的好朋友蜜蜜发现上面的图还 ...
 - OpenCV环境搭建
			
前言 我在上本科时候曾经用过opencv,那时候还是1.x版本,还必须在linux下自己编译. 时过境迁,最近突然想起来写个小程序来分析图片,就又想起了opencv.现在已然是2.4的版本. 环境搭建 ...
 - 记一次解决curl https证书问题
			
问题起因 在访问https的网站时,报出Peer's Certificate has expired的错误.如下: [root@localhost ~]# curl https://www.baidu ...
 - 分析器错误(在浏览器中查看.aspx)
			
分析器错误 说明: 在分析向此请求提供服务所需资源时出错.请检查下列特定分析错误详细信息并适当地修改 分析器错误消息: 未能创建类型"StockManageWebService.Servic ...
 - IOS之frame和bounds区别
			
用最简单的语言来解释就是:setFrame和setBounds都是为了把子view加载到父view上去,但设置的参数坐标系不同,setFrame是该view在父view坐标系统中的位置和大小,setB ...