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的顶点是否会形成回路,我们可以利用并查集的技术来做. 并查集的 ...
随机推荐
- Js触发ASP.NET Validation控件的验证, 同时获取前台验证结果(不包括CustomValidator)
function CallValidate(group) { if (typeof (Page_ClientValidate) == "function") { Page_Bloc ...
- java中List的用法
list的添加删除等操作 import java.util.*; class TestList { public static void main(String[] args) { List<S ...
- Unique Binary Search Trees,Unique Binary Search Trees II
Unique Binary Search Trees Total Accepted: 69271 Total Submissions: 191174 Difficulty: Medium Given ...
- bluestacks安装安卓引擎时出现2502 2503错误的解决办法
2503代表工作站无法启动.2502代表下面的程序调用不支持的MS-DOS函数. 以管理员身份运行命令提示符在经典桌面使用快捷键Win+X,出现一个菜单,选择“命令提示符(管理员) ”即可以以管理员身 ...
- Wordpress 常用代码解释
1. 最新文章 Wordpress最新文章的调用可以使用一行很简单的模板标签 wp_get_archvies来 实现. 代码如下: <?php get_archives('postbypost' ...
- Piggy-Bank (hdoj1114)
Piggy-Bank Problem Description Before ACM can do anything, a budget must be prepared and the necessa ...
- python学习day9
目录 一.队列 二.生产者消费者模型 三.协程 四.select\poll\epoll 五.paramiko 六.mysql API调用 一.队列(queue) 队列分以下三种: class queu ...
- zabbix 组信息
mysql> select * from groups; +---------+------------------+----------+-------+ | groupid | name | ...
- C#操作XML的完整例子——XmlDocument篇(转载,仅做学习之用)
原文地址:http://www.cnblogs.com/serenatao/archive/2012/09/05/2672621.html 这是一个用c#控制台程序下, 用XmlDocument 进 ...
- win7远程工具mstsc.exe
相信很多人都用过类似QQ远程这样的远程工具,其实自xp开始windows就自带了远程工具mstsc.exe. 我只是介绍了如何使用远程工具登入别人的电脑. 首先,在开始->运行->msts ...