Kurskal算法(克鲁斯卡尔算法)
特点:适用于稀疏图,边比较少的图。如果顶点较少,且为稠密图,则用Prim算法。跟Prim算法的用途相同。时间复杂度为O(e*loge),其中e为边数。
代码:
#include <stdio.h>
#include <stdlib.h>
#define MAXEDGE 20 //设定边的最大值
#define INF 65535 //用来设定边的最大值
typedef struct Edge
{
int begin;
int end;
int weight;
}Edge; //构建的边结点
typedef struct EGraph
{
Edge edge[MAXEDGE];
Edge EdgeSorted[MAXEDGE];
int numGraphEdge;
}EGraph; //构建的边集数组结构 static int Flag[MAXEDGE]; //定义排序时各个顶点是否被比较过的状态,如果被比较过赋给EdgeSorted后,Flag = 1
void CreateEGraph(EGraph *G) //构建一个操作的图
{
int i = 0,j = 0,k = 0,w = 0;
printf("请输入图中边的数目:\n");
scanf("%d",&G->numGraphEdge);
for(k = 0;k < G->numGraphEdge;k++)
{
printf("请输入边vi-vj的边的下标 i 和 j ,以及权重w :\n");
scanf("%d,%d,%d",&i,&j,&w);
G->edge[k].begin = i;
G->edge[k].end = j;
G->edge[k].weight = w;
}
for(k = 0;k < G->numGraphEdge;k++) //初始化标示数组
{
Flag[k] = 0;
}
} void SortEdge(EGraph *G) //对边集数组按权值大小进行排序
{
int min,k,i,j;
for(i = 0;i < G->numGraphEdge;i++)
{
min = INF;
for(j = 0;j < G->numGraphEdge;j++)
{
if(Flag[j] == 0 && min >= G->edge[j].weight)
{
min = G->edge[j].weight;
k = j;
}
}
Flag[k] = 1;
G->EdgeSorted[i].begin = G->edge[k].begin;
G->EdgeSorted[i].end = G->edge[k].end;
G->EdgeSorted[i].weight = G->edge[k].weight;
}
printf("\n*******************************\n");
printf("排序后的权值依次为:\n");
for(i = 0;i < G->numGraphEdge;i++)
{
printf("%d ",G->EdgeSorted[i].weight);
}
}
int Find(int *parent,int f) //构造parent数组,为了判断最小生成树中是否构成了回路
{
while(parent[f] > 0) //注意必须是while循环,直到parent[f]中的值为0,返回parent数组下标f
{
f = parent[f];
}
return f;
}
//kurskal算法:依次遍历被排好序的边集数组,如果没有构成回路,就把他加入最小生成树,如果构成回路,则无视继续循环
void Kruskal(EGraph *G)
{
int i = 0,m,n;
int parent[MAXEDGE];
for(i = 0;i < G->numGraphEdge;i++)
{
parent[i] = 0;
}
for(i = 0;i < G->numGraphEdge;i++)
{
m = Find(parent,G->EdgeSorted[i].begin);
n = Find(parent,G->EdgeSorted[i].end);
if(m != n) //说明没有形成环路
{
parent[m] = n;
printf("(%d,%d,%d) ",G->EdgeSorted[i].begin,G->EdgeSorted[i].end,G->EdgeSorted[i].weight);
}
}
} int main()
{
EGraph G; //声明一个图
CreateEGraph(&G); //创建图
SortEdge(&G);
printf("\n*******************************\n");
printf("\nkurskal得到的最小生成树的边为:\n");
Kruskal(&G); //打印由kurskal算法得到的最小生成树的各个边
printf("\n\n*******************************\n");
return 0; }
Kurskal算法(克鲁斯卡尔算法)的更多相关文章
- 最小生成树--克鲁斯卡尔算法(Kruskal)
按照惯例,接下来是本篇目录: $1 什么是最小生成树? $2 什么是克鲁斯卡尔算法? $3 克鲁斯卡尔算法的例题 摘要:本片讲的是最小生成树中的玄学算法--克鲁斯卡尔算法,然后就没有然后了. $1 什 ...
- 贪心算法(Greedy Algorithm)之最小生成树 克鲁斯卡尔算法(Kruskal's algorithm)
克鲁斯卡尔算法(Kruskal's algorithm)是两个经典的最小生成树算法的较为简单理解的一个.这里面充分体现了贪心算法的精髓.大致的流程能够用一个图来表示.这里的图的选择借用了Wikiped ...
- hdu 1233(还是畅通project)(prime算法,克鲁斯卡尔算法)(并查集,最小生成树)
还是畅通project Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- 贪心算法(Greedy Algorithm)最小生成树 克鲁斯卡尔算法(Kruskal's algorithm)
克鲁斯卡尔算法(Kruskal's algorithm)它既是古典最低的一个简单的了解生成树算法. 这充分反映了这一点贪心算法的精髓.该方法可以通常的图被表示.图选择这里借用Wikipedia在.非常 ...
- HDU 1233 还是畅通工程(模板——克鲁斯卡尔算法)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1233 题意描述: 输入n个城镇以及n*(n-1)/2条道路信息 计算并输出将所有城镇连通或者间接连通 ...
- 最小生成树之Kruskal(克鲁斯卡尔)算法
学习最小生成树算法之前我们先来了解下下面这些概念: 树(Tree):如果一个无向连通图中不存在回路,则这种图称为树. 生成树 (Spanning Tree):无向连通图G的一个子图如果是一颗包含G的所 ...
- prim算法,克鲁斯卡尔算法---最小生成树
最小生成树的一个作用,就是求最小花费.要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的任意两个之间都可以通信,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要使铺设光 ...
- 图->连通性->最小生成树(克鲁斯卡尔算法)
文字描述 上一篇博客介绍了最小生成树(普里姆算法),知道了普里姆算法求最小生成树的时间复杂度为n^2, 就是说复杂度与顶点数无关,而与弧的数量没有关系: 而用克鲁斯卡尔(Kruskal)算法求最小生成 ...
- hdu5441 并查集+克鲁斯卡尔算法
这题计算 一张图上 能走的 点对有多少个 对于每个限制边权 , 对每条边排序,对每个查询排序 然后边做克鲁斯卡尔算法 的时候变计算就好了 #include <iostream> #inc ...
- 最小生成树-克鲁斯卡尔算法(kruskal's algorithm)实现
算法描述 克鲁斯卡尔算法是一种贪心算法,因为它每一步都挑选当前最轻的边而并不知道全局路径的情况. 算法最关键的一个步骤是要判断要加入mst的顶点是否会形成回路,我们可以利用并查集的技术来做. 并查集的 ...
随机推荐
- tomcat应用服务器
Tomcat性能调优方案 一.操作系统调优 对于操作系统优化来说,是尽可能的增大可使用的内存容量.提高CPU的频率,保证文件系统的读写速率等.经过压力测试验证,在并发连接很多的情况下,CPU的处理能力 ...
- c语言字符串比较函数strcmp
strcmp(s1,s2) 说明: 当s1<s2时,返回值<0 当s1=s2时,返回值=0 当s1>s2时,返回值>0两个字符串自左向右逐个字符相比(按ASCII值大小相比较) ...
- vim自动补全文章搜集
引用文章A:http://blog.csdn.net/wendy260310/article/details/18035555 文章介绍:添加C++标准库的tags文件方法.(中文版) 引用文章B:h ...
- word保存时标题变成黑框(mac版本)
参考:http://blog.sina.com.cn/s/blog_686020310101i2zu.html 参考文档中说的时windows版本的word,跟我mac处理方式有一些不同: word版 ...
- iOS Dev (21) 用 AVPlayer 播放一个本地音频文件
iOS Dev (21) 用 AVPlayer 播放一个本地音频文件 作者:CSDN 大锐哥 博客:http://blog.csdn.net/prevention 前言 这篇文章与上一篇极其相似,要注 ...
- windows 文件watch nodejs
本篇博客,主要是记录下最近一直纠结的gulp.watch方法,在工作中我们肯定都遇到过,新添加的文件没办法自动触发watch,下面我们就来看有什么办法处理 1.首先我们肯定是先百度一下 百度推荐的是g ...
- fdisk -l 找不到分区怎么办?想办法找到隐藏分区。
centos6.6 装系统的时候,选取系统默认分区.装好后发现少了一大部分空间,通过fdisk -l 找不到分区,另外使用 parted -l 同样找不到消失的柱面. 如: [root@mysql]# ...
- Kali Linux 新手折腾笔记
http://defcon.cn/1618.html 2014年09月29日 渗透测试 暂无评论 阅读 55,052 次 最近在折腾Kali Linux 顺便做一简单整理,至于安装就不再多扯了,估 ...
- iOS正则表达式的使用
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- Ubuntu安装与初始配置
转载请注明作者:梦里风林 更多文章查看我的个人站: ahangchen.site 适用于Ubuntu版本 14.04/16.04LTS 64位 先上图 双系统安装 划分空闲磁盘,U盘安装ubuntu ...