克鲁斯卡尔(Kruskal)算法

# 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)算法的更多相关文章
- 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用
图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...
- 洛谷P3366【模板】最小生成树-克鲁斯卡尔Kruskal算法详解附赠习题
链接 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M&l ...
- 图解最小生成树 - 克鲁斯卡尔(Kruskal)算法
我们在前面讲过的<克里姆算法>是以某个顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树的.同样的思路,我们也可以直接就以边为目标去构建,因为权值为边上,直接找最小权值的边来构建生成树 ...
- 克鲁斯卡尔(Kruskal)算法求最小生成树
/* *Kruskal算法求MST */ #include <iostream> #include <cstdio> #include <cstring> #inc ...
- 最小生成树——Kruskal(克鲁斯卡尔)算法
[0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 Kruskal(克鲁斯卡尔)算法 的idea 并用 源代码加以实现: 0.2)最小生成树的基础知识,参见 ...
- 经典问题----最小生成树(kruskal克鲁斯卡尔贪心算法)
题目简述:假如有一个无向连通图,有n个顶点,有许多(带有权值即长度)边,让你用在其中选n-1条边把这n个顶点连起来,不漏掉任何一个点,然后这n-1条边的权值总和最小,就是最小生成树了,注意,不可绕成圈 ...
- 最小生成树之克鲁斯卡尔(kruskal)算法
#include <iostream> #include <string> using namespace std; typedef struct MGraph{ string ...
- 数据结构与算法——克鲁斯卡尔(Kruskal)算法
目录 应用场景-公交站问题 克鲁斯卡尔算法介绍 克鲁斯卡尔算法图解 克鲁斯卡尔算法分析 如何判断回路? 代码实现 无向图构建 克鲁斯卡尔算法实现 获取一个点的终点解释 应用场景-公交站问题 某城市新增 ...
- 图->连通性->最小生成树(克鲁斯卡尔算法)
文字描述 上一篇博客介绍了最小生成树(普里姆算法),知道了普里姆算法求最小生成树的时间复杂度为n^2, 就是说复杂度与顶点数无关,而与弧的数量没有关系: 而用克鲁斯卡尔(Kruskal)算法求最小生成 ...
随机推荐
- ISP图像质量自动化测试方法
背景介绍 ISP(Image Signal Processor),即图像处理,主要作用是对前端图像传感器输出的信号做后期处理,主要功能有线性纠正.噪声去除.坏点去除.内插.白平衡.自动曝光控制等,依赖 ...
- Amzon MWS API开发之 请求报告
时间一晃而过又过了两周,博客园更新的速度确实有点慢,今天我要分享的是对请求报告的调用. 在文档中,相信大家也看了下面这个流程图吧? 相关流程,在文档中也有细说,我就不一一去Copy了:http://d ...
- Windows服务程序的原理及实现(服务分为WIN32服务和系统服务)
今天给大家讲下怎样做一个服务程序...本来是想详细讲的,不过写着写着累得要命..很多 地方就没详细...不过代码我加了点注...如果还有一些不明白的自己查下MSDN......便宜 环境,,VC++6 ...
- C#正则表达式匹配任意字符
原文:C#正则表达式匹配任意字符 不得不说正则很强大,尤其在字符串搜索上 匹配任意字符,包括汉字,换行符: [\s\S]*. 版权声明:本文为博主原创文章,未经博主允许不得转载.
- java设计模式--行为型模式--迭代模式
迭代器模式 概述 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 适用性 .访问一个聚合对象的内容而无需暴露它的内部表示. .支持对聚合对象的多种遍历 ...
- COCI 2015/2016 Day 8 PROKLETNIK
PROKLETNIK 题目描述:给出\(n\)个数,定义一段连续的数为魔法串是该区间的左右端点值正好是区间的最小值与最大值(最小值可以在左也可以在右,最大值也一样).\(Q\)个询问,每次询问一个区间 ...
- linux之SQL语句简明教程---UNION
UNION 指令的目的是将两个 SQL 语句的结果合并起来.从这个角度来看, UNION 跟 JOIN有些许类似,因为这两个指令都可以由多个表格中撷取资料. UNION 的一个限制是两个 SQL 语句 ...
- http://www.lanceyan.com/tech/mongodb/mongodb_repset1.html
http://www.lanceyan.com/tech/mongodb/mongodb_repset1.html
- java logger级别
typedef enum android_LogPriority { ANDROID_LOG_UNKNOWN = 0, ANDROID_LOG_DEFAULT, /* only for SetM ...
- 为什么VS提示SurfFeatureDetector不是cv的成员函数
surf和sift算法都是在头文件#include <opencv2/features2d/features2d.hpp>中,但在新的opencv版本出来后,如果仍然使用这个头文件就会出现 ...