#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAX 100
/* 定义边(x,y),权为w */
typedef struct
{
int x, y;
int w;
}edge;
edge e[MAX];
/* rank[x]表示x的秩 */
int rank[MAX];
/* father[x]表示x的父节点 */
int father[MAX];
int sum;
typedef int (*cmptr)(const int a, const int b);
/* 比较函数,按权值(相同则按x坐标)非降序排序 */
int cmp(const int a, const int b)
{
if (a == b)
{
return (a - b);
}
return (a-b);
}
/*堆排序*/
void HeapAdjust(edge *e,int s,int m)
{
edge *rc=(edge*)malloc(sizeof(edge));
*rc=e[s];
for(int j=2*s;j<=m;j*=2)
{
if(j<m && cmp(e[j].w,e[j+1].w)<0) j++;
if(cmp(rc->w,e[j].w)>0) break;
e[s]=e[j];
s=j;
}
e[s]=*rc;
}
void qsort(edge *e, int n, cmptr fun)
{
//建大顶堆
for(int i=n/2;i>0;i--)
{
HeapAdjust(e,i,n);
}
//排序
edge *temp=(edge*)malloc(sizeof(edge));
for(i=n;i>0;i--)
{
*temp=e[1];
e[1]=e[i];
e[i]=*temp;
//e[i].w=0;
HeapAdjust(e,1,i-1);
}
}
/* 初始化集合 */
void Make_Set(int x)
{
father[x] = x;
rank[x] = 0;
}
/* 查找x元素所在的集合,回溯时压缩路径 */
int Find_Set(int x)
{
if (x != father[x])
{
father[x] = Find_Set(father[x]);
}
return father[x];
}
/* 合并x,y所在的集合 */
void Union(int x, int y, int w)
{
if (x == y) return;
/* 将秩较小的树连接到秩较大的树后 */
if (rank[x] > rank[y])
{
father[y] = x;
}
else
{
if (rank[x] == rank[y])
{
rank[y]++;
}
father[x] = y;
}
sum += w;
}
/* 主函数 */
int main()
{
int i, n;
int x, y;
char chx, chy;
/* 读取边的数目 */
scanf("%d", &n);
getchar();
/* 读取边信息并初始化集合 */
for (i = 1; i <=n; i++)
{
scanf("%c %c %d", &chx, &chy, &e[i].w);
getchar();
e[i].x = chx - 'A'+1;
e[i].y = chy - 'A'+1;
Make_Set(i);
}
/* 将边排序 */
qsort(e, n, cmp);
sum = 0;
for (i = 1; i <=n; i++)
{
x = Find_Set(e[i].x);
y = Find_Set(e[i].y);
if (x != y)
{
printf("%c - %c : %d\n",e[i].x + 'A'-1, e[i].y + 'A'-1, e[i].w);
Union(x, y, e[i].w);
}
}
printf("Total:%d\n", sum);
//system("pause");
return 0;
}
分享到:
相关推荐
C语言采用邻接表结构实现克鲁斯卡尔算法。 也可以在相应github上下载,https://github.com/Sunnk/Data-Structure,其中Kruskal文件夹中即为克鲁斯卡尔算法,可用vs打开
在`克鲁斯卡尔算法C和C++实现代码.doc`文档中,你可能找到以下内容:完整的C或C++代码示例,包括了上述步骤的详细实现,以及可能的注释和解释。这些代码可以直接运行,以验证算法的正确性。同时,它们可以作为学习和...
克鲁斯卡尔算法是图论中的一个重要算法,用于寻找加权无向图的最小生成树。这个算法由美国数学家莫里斯·克鲁斯卡尔在1956年提出,其...在实际编程中,理解并查集的原理和正确使用它,是成功实现克鲁斯卡尔算法的关键。
克鲁斯卡尔算法构造最小生成树 克鲁斯卡尔算法构造最小生成树
克鲁斯卡尔算法C源代码分析 克鲁斯卡尔算法是一种常用的最小生成树算法,它可以在无向图中找出最小生成树。下面是对克鲁斯卡尔算法C源代码的分析: 一、数据结构 在克鲁斯卡尔算法中,使用了两个结构体:node和...
在实现克鲁斯卡尔算法时,关键在于如何高效地管理顶点的集合,以判断边的加入是否会造成环路。并查集正是为了优化这一过程而设计的数据结构。它通过“查找”和“合并”两种操作,使得我们可以快速确定两个顶点是否...
在MATLAB中实现克鲁斯卡尔算法,我们需要遵循以下步骤: 1. **数据结构选择**:首先,我们需要表示图的数据结构。在MATLAB中,可以使用邻接矩阵或邻接表来存储图。邻接矩阵是一个二维数组,其中的每个元素表示两个...
在C和C++中实现克鲁斯卡尔算法的过程大同小异,主要步骤包括图的初始化、边的排序、并查集的查找和合并。 首先,我们需要定义图的数据结构。在C语言中,可以使用结构体定义图的表示,如示例中的MGraph。该结构体中...
总的来说,克鲁斯卡尔算法是解决图论问题的一种重要工具,通过MATLAB这样的编程语言可以方便地实现和应用。在学习和理解这个算法的过程中,不仅需要掌握基本的图论知识,还需要对并查集数据结构有一定的理解。通过...
用邻接矩阵和邻接链表的来实现克鲁斯卡尔算法。代码中有详细的注释
《克鲁斯卡尔算法:构建最小生成树的精要解析》 在图论的世界里,寻找最优化...在实际的编程实现中,熟练掌握克鲁斯卡尔算法不仅能解决图论问题,还能在许多实际应用中发挥重要作用,例如网络设计、资源分配等领域。
在JavaScript中实现克鲁斯卡尔算法,你需要考虑以下几个关键部分: - **表示图**:可以使用邻接矩阵或邻接表来表示图。对于无向图,邻接矩阵是对称的,邻接表通常更节省空间。 - **排序边**:创建一个数组存储所有...
根据给定的部分内容,我们可以看到这个程序是用 C 语言编写的,它实现了克鲁斯卡尔算法来寻找最小生成树。下面是对代码的详细解释: 1. **数据结构定义**: - 定义了 `MGraph` 结构体来表示图的信息,包括邻接矩阵...
这个测试文件可能包含一个主函数,用于测试克鲁斯卡尔算法的实现,以及一些辅助方法,如打印最小生成树,或者生成测试用例的图。 在实际编程中,我们可能会使用`PriorityQueue`来存储边并按权重排序,使用`...
要使用C/C++语言实现克鲁斯卡尔算法,首先需要定义一个结构体来表示图,该结构体应包含图的顶点数、边数以及存储图边信息的数组。在创建图的过程中,可以使用邻接矩阵作为图的存储方式。邻接矩阵是一个二维数组,...
在提供的kr.cpp文件中,应包含了克鲁斯卡尔算法的具体实现,可能包括读取图的边信息、边的排序、并查集的实现以及输出最小生成树的过程。通过分析和理解代码,可以更好地掌握克鲁斯卡尔算法的细节和实际应用。
本文档描述的项目是使用C/C++编程语言实现克鲁斯卡尔算法,以构建最小生成树。最小生成树问题通常出现在网络连接优化场景中,例如在n个城市间建立通信网络,目标是以最低成本连接所有城市。克鲁斯卡尔算法就是解决这...
用C++实现的图的建立 以及用普里姆算法和克鲁斯卡尔算法求图的最小生成树
在C/C++编程中,实现克鲁斯卡尔算法通常包括以下步骤: - 定义结构体,如`struct Edge`,包含边的起始顶点、结束顶点和权重。 - 创建邻接矩阵,存储图的信息。 - 对所有边按照权重进行排序。 - 初始化一个空集合...
若要在n个城市之间建设通信网络,只需要架设n-1条线路即可。如何以最低的经济代价建设这个通信网,是一个网...(2)利用普里姆算法和克鲁斯卡尔算法求网的最小生成树; (3)按顺序输出生成树中各条边以及它们的权值。