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.也有可能是空 ...
随机推荐
- WCF学习笔记之事务编程
WCF学习笔记之事务编程 一:WCF事务设置 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元: WCF通过System.ServiceModel.TransactionFlowA ...
- activity的android:name所指的Activity实现类的简写问题
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package=" ...
- .net程序员求职简历
.net程序员求职简历 个人概况 姓名 齐志超 学历 专科 毕业学校 河北软件职业技术学院 专业 软件开发与设计 手机 18730269286 年龄 22 性别 男 现居住地 北京 电子邮件 qzc9 ...
- SPFILE 、PFILE 的全面解读
这里先阐述一下数据库的启动过程: 1. 启动实例/例程(nomount状态)时,读取参数文件(文本文件PFILE 或服务器参数文件SPFILE),分配SGA.启动后台进程.打开告警文件及后台 ...
- javascript提高篇+吐槽
开篇吐槽 最近一直在投简历找工作,对于博主这样的屌丝应届生来说,一没过硬的技术,二没经验,三没高学历,四没炫酷的项目,五还没漂亮的简历,简直就是3无产品+2b青年.所以快1个月了投的简历没有收到一个面 ...
- 如何编译Apache Hadoop2.2.0源代码
转自(原文图片已丢失,本文修复图片,重新排版,并更正部分原文错误):http://www.superwu.cn/2013/12/26/913 欢迎和大家交流技术相关问题: 邮箱: jiangxinnj ...
- Crystal Report 纵向排列,多列格式化
一个表格区域就是一条数据,一张A4纸分布成2列4行打印. 这与通常的报表有点不一样,通常报表的明细都是一条一行:而现在要每2条放在一行,这需要用到“多列格式化”属性. 选择"多列格式”后,会 ...
- 读取Oracle表结构数据
<html lang="zh-cn"> <head> <meta name="generator" content="O ...
- 双数组trie树的基本构造及简单优化
一 基本构造 Trie树是搜索树的一种,来自英文单词"Retrieval"的简写,可以建立有效的数据检索组织结构,是中文匹配分词算法中词典的一种常见实现.它本质上是一个确定的有限状 ...
- VS2010 编译 sqlite3 生成动态库和链接库
如果想以dll的方式使用sqlite而新建空的dll工程,添加sqlite源文件,会发现能生成dll,但缺乏lib函数信息映射库,单独使用dll文件是比较麻烦的,而网上多数做法是通过lib.exe手动 ...