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的顶点是否会形成回路,我们可以利用并查集的技术来做. 并查集的 ...
随机推荐
- 网页 php开发中html空文本节点问题user agent stylesheetbody
最近开发中遇到一个奇怪的问题,我的一个网站头部,代码固定不变,放在了不同的模板进行展示,一部分出现了问题,总是距离相差8个像素,用firebug查看发现:meta 跑到 body 下面去了,并且发现了 ...
- Android studio教程:[2]项目整体布局
上篇介绍了如何创建项目,这一次将介绍创建完的项目如何呈现在开发者的眼前,介绍android studio开发环境的整体布局,让大家知道各个模块的位置和功能. 工具/原料 Android studio ...
- 无法启动计算机"."上的服务w3svc
在启动IIS服务的时候出现错误: 无法启动计算机"."上的服务w3svc 解决方法: /* 修复错误 运行命令提示符 fsutil resource setautoreset tr ...
- Android 贝塞尔曲线
博客图片备份位置:
- sqlite数据库常用语句
这个文件型数据库小巧好用,可以替代ACCESS,以下是常用的语句 获取数据库时间(设计表字段时的当前时间默认值) sqlite datetime('now', 'localtime') ...
- 【ecos学习3】redboot on vmware 网络配置
需要图形化编译的时候必须 Build->Packages 加入:Common ethernet support 才可以有网络功能 导入vmare需要修改网络连接模式: 1- 设置redbootI ...
- 设计师如何为 Android 应用标注尺寸
http://blog.cutterman.cn/?p=33 1. 画布大小定位 720 x 1280,72 dpi2. 只使用偶数单位的尺寸,比如 96 px 的列表项高度,16 px 的边距,64 ...
- nginx---Beginner's Guide
一 启动 nginx -s signal Where signal may be one of the following: stop — fast shutdown quit — graceful ...
- 【测试环境】cywin的简单介绍
有的时候,单位可能不会这么慷慨给你很多硬件设备供你在任何环境下面都能够工作,但我们有时候需要unix环境,这个时候cywin诞生了... 该工具非常强大,基本上能够满足您的基本需求: 1.安装cywi ...
- CRAHNs: Cognitive radio ad hoc networks
2009 Elsevier 综述了认知无线AD Hoc网络中的各个方面的研究进展及面临的挑战.包括传输层.网络层.链路层的协议设计. 根据CCC(common control channel)的实现思 ...