特点:适用于稀疏图,边比较少的图。如果顶点较少,且为稠密图,则用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算法(克鲁斯卡尔算法)的更多相关文章

  1. 最小生成树--克鲁斯卡尔算法(Kruskal)

    按照惯例,接下来是本篇目录: $1 什么是最小生成树? $2 什么是克鲁斯卡尔算法? $3 克鲁斯卡尔算法的例题 摘要:本片讲的是最小生成树中的玄学算法--克鲁斯卡尔算法,然后就没有然后了. $1 什 ...

  2. 贪心算法(Greedy Algorithm)之最小生成树 克鲁斯卡尔算法(Kruskal&#39;s algorithm)

    克鲁斯卡尔算法(Kruskal's algorithm)是两个经典的最小生成树算法的较为简单理解的一个.这里面充分体现了贪心算法的精髓.大致的流程能够用一个图来表示.这里的图的选择借用了Wikiped ...

  3. hdu 1233(还是畅通project)(prime算法,克鲁斯卡尔算法)(并查集,最小生成树)

    还是畅通project Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  4. 贪心算法(Greedy Algorithm)最小生成树 克鲁斯卡尔算法(Kruskal&#39;s algorithm)

    克鲁斯卡尔算法(Kruskal's algorithm)它既是古典最低的一个简单的了解生成树算法. 这充分反映了这一点贪心算法的精髓.该方法可以通常的图被表示.图选择这里借用Wikipedia在.非常 ...

  5. HDU 1233 还是畅通工程(模板——克鲁斯卡尔算法)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1233 题意描述: 输入n个城镇以及n*(n-1)/2条道路信息 计算并输出将所有城镇连通或者间接连通 ...

  6. 最小生成树之Kruskal(克鲁斯卡尔)算法

    学习最小生成树算法之前我们先来了解下下面这些概念: 树(Tree):如果一个无向连通图中不存在回路,则这种图称为树. 生成树 (Spanning Tree):无向连通图G的一个子图如果是一颗包含G的所 ...

  7. prim算法,克鲁斯卡尔算法---最小生成树

    最小生成树的一个作用,就是求最小花费.要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的任意两个之间都可以通信,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要使铺设光 ...

  8. 图->连通性->最小生成树(克鲁斯卡尔算法)

    文字描述 上一篇博客介绍了最小生成树(普里姆算法),知道了普里姆算法求最小生成树的时间复杂度为n^2, 就是说复杂度与顶点数无关,而与弧的数量没有关系: 而用克鲁斯卡尔(Kruskal)算法求最小生成 ...

  9. hdu5441 并查集+克鲁斯卡尔算法

    这题计算 一张图上 能走的 点对有多少个  对于每个限制边权 , 对每条边排序,对每个查询排序 然后边做克鲁斯卡尔算法 的时候变计算就好了 #include <iostream> #inc ...

  10. 最小生成树-克鲁斯卡尔算法(kruskal's algorithm)实现

    算法描述 克鲁斯卡尔算法是一种贪心算法,因为它每一步都挑选当前最轻的边而并不知道全局路径的情况. 算法最关键的一个步骤是要判断要加入mst的顶点是否会形成回路,我们可以利用并查集的技术来做. 并查集的 ...

随机推荐

  1. linux重要的标准目录和文件

    linux重要的标准目录和文件 / 根目录,所有其他文件在根文件系统的子目录下 /bin 基本命令的二进制文件,存放linux下常用的命令和工具 /boot 引导加载器的固有文件,linux就是从这里 ...

  2. Android sample 之模拟重力感应,加速度

    class SimulationView extends View implements SensorEventListener { // diameter of the balls in meter ...

  3. javascript的stringFormat函数实现

    写一个简单的stringFormat来给自己用 function stringFormat(format, args) { var formatData; if (arguments.length = ...

  4. XML的Schema约束

    XSD文档至少要包含:schema根元素和XML模式命名空间的定义.元素定义.需要注意的是XSD中必须定义一个且只能定义一个schema根元素,根元素中包括模式的约束,XML模式命名空间的定义,其他命 ...

  5. 记glide框架使用中所遇到的问题

    最近实在是太忙,每有时间写博客.记得之前写过一篇关于glide加载图片不显示的博客,但是给出最终的解决方法.这次我将把在项目中使用glide所遇到的问题总结一下. 1.使用glide最好对glide进 ...

  6. UDP包的大小与MTU

    在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好?当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,我这里仅对像ICQ一类的发送聊天消息的情况作分 ...

  7. 2014.06.20 (转)IEEE与论坛灌水

    转自"饮水思源"      电子类学生大都知道IEEE, 这个IEEE就像一个大的BBS论坛,而这个协会下面有很多杂志,比如图像处理,信号处理,微波技术等.这些杂志就是论坛下的分版 ...

  8. 顶尖数据挖掘教学案例库(TipDM-C10)产品白皮书

          顶尖数据挖掘教学案例库 (TipDM-C10)           产  品  说  明  书 广州泰迪智能科技有限公司 版权所有 地址: 广州市经济技术开发区科学城232号 网址: ht ...

  9. python爬爬爬之单网页html页面爬取

    python爬爬爬之单网页html页面爬取 作者:vpoet mail:vpoet_sir@163.com 注:随意copy 不用告诉我 #coding:utf-8 import urllib2 Re ...

  10. Monthly Expense(二分) 分类: 二分查找 2015-06-06 00:31 10人阅读 评论(0) 收藏

    Description Farmer John is an astounding accounting wizard and has realized he might run out of mone ...