# include <stdio.h>

 # define MAX_VERTEXES //最大顶点数
# define MAXEDGE //边集数组最大值
# define INFINITY //代表不可能的数(无穷大) typedef struct
{//图 结构体定义
int arc[MAX_VERTEXES][MAX_VERTEXES];//二位数组 矩阵
int numVertexes, numEdges;//当前图中的顶点数和边数 }MGraph; typedef struct
{//边集数组 结构体定义
int begin;
int end;
int weight; }Edge; void CreateMGraph (MGraph *G)
{//创建
int i, j;
//下面是已经输入好的
G->numVertexes = ;
G->numEdges = ; for (i=; i<G->numVertexes; i++)
for (j=; j<G->numVertexes; j++)
if (i == j)
G->arc[i][j] = ;
else
G->arc[i][j] = G->arc[j][i] = INFINITY; G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=; for (i=; i<G->numVertexes; i++)
for (j=i+; j<G->numVertexes; j++)//矩阵的上三角,然后对称矩阵的下三角
G->arc[j][i] = G->arc[i][j];//对称
} void swapn (Edge *edges, int i, int j)
{//交换权值
int temp; //起始
temp = edges[i].begin;
edges[i].begin = edges[j].begin;
edges[j].begin = temp; //结束
temp = edges[i].end;
edges[i].end = edges[j].end;
edges[j].end = temp; //权值
temp = edges[i].weight;
edges[i].weight = edges[j].weight;
edges[j].weight = temp; return ;
} void sort (Edge edges[], MGraph *G)
{//对权值进行排序
int i, j;
for (i=; i<G->numEdges; i++)
for (j=i+; j<G->numEdges; j++)//对存入有效边(两端点的权值)进行冒泡排序
if (edges[i].weight > edges[j].weight)
swapn (edges, i, j);//交换权值 printf ("排序过后:\n");
for (i=; i<G->numEdges; i++)
printf ("边:(%d,%d) 权值:%d\n", edges[i].begin, edges[i].end, edges[i].weight); return ;
} int Find (int *parent, int f)//★
{// 查找连线顶点的尾部下标
//走过的路都有记录,如果走已经走过的路的话,那么返回的值(n=m);
while (parent[f] > )
f = parent[f];
return f;
} void MiniSpanTree_Kruskal (MGraph G)
{//克鲁斯卡尔算法
int i, j, n, m;
int k = ;
int parent[MAX_VERTEXES];//定义一维数组判断是否形成环路
Edge edges[MAXEDGE];//定义边集数组 for (i=; i<G.numVertexes; i++)//存储有效的边(两个端点和权值)
for (j=i+; j<G.numVertexes; j++)//矩阵上三角进行比较,因为对称,所以比较一半更节约时间
if (G.arc[i][j] < INFINITY)
{
edges[k].begin = i;
edges[k].end = j;
edges[k ++].weight = G.arc[i][j];
}
sort(edges, &G);//排序 for (i=; i<G.numVertexes; i++)
parent[i] = ; printf ("\n打印最小生成树:\n");
for (i=; i<G.numEdges; i++)
{
n = Find (parent, edges[i].begin);//★
m = Find (parent, edges[i].end);//★
if (n != m)
{
parent[n] = m;
printf ("边(%d,%d) 权值:%d\n", edges[i].begin, edges[i].end, edges[i].weight);
}
}
} int main (void) {
MGraph G;
CreateMGraph (&G);//创建
MiniSpanTree_Kruskal (G);//克鲁斯卡尔 算法 return ;
} /*
在vc++6.0运行结果: 排序过后:
边:(4,7) 权值:7
边:(2,8) 权值:8
边:(0,1) 权值:10
边:(0,5) 权值:11
边:(1,8) 权值:12
边:(3,7) 权值:16
边:(1,6) 权值:16
边:(5,6) 权值:17
边:(1,2) 权值:18
边:(6,7) 权值:19
边:(3,4) 权值:20
边:(3,8) 权值:21
边:(2,3) 权值:22
边:(3,6) 权值:24
边:(4,5) 权值:26 打印最小生成树:
边(4,7) 权值:7
边(2,8) 权值:8
边(0,1) 权值:10
边(0,5) 权值:11
边(1,8) 权值:12
边(3,7) 权值:16
边(1,6) 权值:16
边(6,7) 权值:19
Press any key to continue
*/

克鲁斯卡尔(Kruskal)算法的更多相关文章

  1. 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用

    图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...

  2. 洛谷P3366【模板】最小生成树-克鲁斯卡尔Kruskal算法详解附赠习题

    链接 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M&l ...

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

    我们在前面讲过的<克里姆算法>是以某个顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树的.同样的思路,我们也可以直接就以边为目标去构建,因为权值为边上,直接找最小权值的边来构建生成树 ...

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

    /* *Kruskal算法求MST */ #include <iostream> #include <cstdio> #include <cstring> #inc ...

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

    [0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 Kruskal(克鲁斯卡尔)算法 的idea 并用 源代码加以实现: 0.2)最小生成树的基础知识,参见 ...

  6. 经典问题----最小生成树(kruskal克鲁斯卡尔贪心算法)

    题目简述:假如有一个无向连通图,有n个顶点,有许多(带有权值即长度)边,让你用在其中选n-1条边把这n个顶点连起来,不漏掉任何一个点,然后这n-1条边的权值总和最小,就是最小生成树了,注意,不可绕成圈 ...

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

    #include <iostream> #include <string> using namespace std; typedef struct MGraph{ string ...

  8. 数据结构与算法——克鲁斯卡尔(Kruskal)算法

    目录 应用场景-公交站问题 克鲁斯卡尔算法介绍 克鲁斯卡尔算法图解 克鲁斯卡尔算法分析 如何判断回路? 代码实现 无向图构建 克鲁斯卡尔算法实现 获取一个点的终点解释 应用场景-公交站问题 某城市新增 ...

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

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

随机推荐

  1. 寒冰王座(hd1248)

    寒冰王座 Problem Description 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票(记住,只有一张钞票),为了防止自己在战斗中频繁的死掉,他决定给自己买一些道具,于是他来到了地精商店 ...

  2. python学习之day11

    目录 SqlAlchemy 外键     SqlAlechemy SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是 ...

  3. Android Studio中获取sha1证书指纹数据的方法

    高德地图开发申请KEY的时候需要开发者提供SHA1证书指纹数据,在eclipse很容易就找到了,但是Android Studio很久也没找到,只能使用在网上看到的方法了,在Android Studio ...

  4. haproxy redirect prefix

    acl short_domain hdr(Host) -i etiantian.org redirect prefix http://www.etiantian.org code 301 if sho ...

  5. 栈的C数组实现

    栈是一种先进后出的数据结构.栈的基本操作包括:入栈,出栈,初始化栈,清空栈,遍历栈. C代码如下: #include <stdio.h> #define MaxSize 20 typede ...

  6. mongodb导出命令

    ./mongoexport -d admin -c col -o col.json 找到了 导出所有数据库的 http://www.jb51.net/article/52498.htm

  7. OC基础3:一些基本概念

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.关于NSLog函数中的“%2i”: ( ...

  8. Longge的问题(欧拉,思维)

     Longge的问题 Submit Status Practice HYSBZ 2705 Description Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题.现在问题来了:给定一 ...

  9. NYOJ 46-最少乘法次数(数论)

    题目地址:pid=46">NYOJ 46 思路:能够化成二进制来求解.结果是最高位的位数-1+最高位后面1的个数.比如:对于3.它的二进制代码为11,就是用这个最高位(2-1)加上后面 ...

  10. 聚类算法初探(五)DBSCAN

    最近由于工作需要,对聚类算法做了一些相关的调研.现将搜集到的资料和自己对算法的一些理解整理如下,供大家参考. 另外在算法代码方面,我也做了一些实现(包括串行和并行),欢迎感兴趣的朋友探讨和交流. 第一 ...