`

克鲁斯卡尔算法的C实现

阅读更多
#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语言邻接表结构实现克鲁斯卡尔算法

    C语言采用邻接表结构实现克鲁斯卡尔算法。 也可以在相应github上下载,https://github.com/Sunnk/Data-Structure,其中Kruskal文件夹中即为克鲁斯卡尔算法,可用vs打开

    克鲁斯卡尔算法C和C++实现代码

    在`克鲁斯卡尔算法C和C++实现代码.doc`文档中,你可能找到以下内容:完整的C或C++代码示例,包括了上述步骤的详细实现,以及可能的注释和解释。这些代码可以直接运行,以验证算法的正确性。同时,它们可以作为学习和...

    克鲁斯卡尔算法.zip

    克鲁斯卡尔算法是图论中的一个重要算法,用于寻找加权无向图的最小生成树。这个算法由美国数学家莫里斯·克鲁斯卡尔在1956年提出,其...在实际编程中,理解并查集的原理和正确使用它,是成功实现克鲁斯卡尔算法的关键。

    克鲁斯卡尔算法构造最小生成树

    克鲁斯卡尔算法构造最小生成树 克鲁斯卡尔算法构造最小生成树

    算法分析与设计---克鲁斯卡尔算法

    在克鲁斯卡尔算法的具体实现中,通常包括以下步骤: 1. 初始化:创建一个空的边集合,用于存储构成最小生成树的边;对于每个顶点,将其分配给不同的集合(例如,使用整数数组set,每个顶点分配一个唯一的整数,表示...

    克鲁斯卡尔算法c源代码[文].pdf

    克鲁斯卡尔算法C源代码分析 克鲁斯卡尔算法是一种常用的最小生成树算法,它可以在无向图中找出最小生成树。下面是对克鲁斯卡尔算法C源代码的分析: 一、数据结构 在克鲁斯卡尔算法中,使用了两个结构体:node和...

    克鲁斯卡尔算法C和C++ 实现代码.doc

    克鲁斯卡尔算法C和C++实现代码 克鲁斯卡尔算法是解决最小生成树问题的一种常用算法,它的基本思想是将图中的所有边按照权值从小到大排序,然后选择最小权值的边,直到所有顶点都被连接到一起。 在给定的C代码中,...

    克鲁斯卡尔matlab算法

    在MATLAB中实现克鲁斯卡尔算法,我们需要遵循以下步骤: 1. **数据结构选择**:首先,我们需要表示图的数据结构。在MATLAB中,可以使用邻接矩阵或邻接表来存储图。邻接矩阵是一个二维数组,其中的每个元素表示两个...

    最小生成树 克鲁斯卡尔算法 kruskal

    总的来说,克鲁斯卡尔算法是解决图论问题的一种重要工具,通过MATLAB这样的编程语言可以方便地实现和应用。在学习和理解这个算法的过程中,不仅需要掌握基本的图论知识,还需要对并查集数据结构有一定的理解。通过...

    邻接矩阵和邻接链表的克鲁斯卡尔算法

    用邻接矩阵和邻接链表的来实现克鲁斯卡尔算法。代码中有详细的注释

    数据结构,最小生成树克鲁斯卡尔算法的实现.pdf

    克鲁斯卡尔算法的实现可以分为以下几个步骤: 1. 首先,我们需要定义结构体来存储图的信息,包括图的顶点数、边数、邻接矩阵等。 2. 接下来,我们需要创建图,使用邻接矩阵存储结构,并将图的信息存储在结构体中。 ...

    Kruskal克鲁斯卡尔算法构造最小生成树的动画.zip

    《克鲁斯卡尔算法:构建最小生成树的精要解析》 在图论的世界里,寻找最优化...在实际的编程实现中,熟练掌握克鲁斯卡尔算法不仅能解决图论问题,还能在许多实际应用中发挥重要作用,例如网络设计、资源分配等领域。

    克鲁斯卡尔算法的javascript实现

    在JavaScript中实现克鲁斯卡尔算法,你需要考虑以下几个关键部分: - **表示图**:可以使用邻接矩阵或邻接表来表示图。对于无向图,邻接矩阵是对称的,邻接表通常更节省空间。 - **排序边**:创建一个数组存储所有...

    .编写实现克鲁斯卡尔算法的程序,求最小生成树。

    根据给定的部分内容,我们可以看到这个程序是用 C 语言编写的,它实现了克鲁斯卡尔算法来寻找最小生成树。下面是对代码的详细解释: 1. **数据结构定义**: - 定义了 `MGraph` 结构体来表示图的信息,包括邻接矩阵...

    最小生成树:Kruskal(克鲁斯卡尔)算法实现(java)

    这个测试文件可能包含一个主函数,用于测试克鲁斯卡尔算法的实现,以及一些辅助方法,如打印最小生成树,或者生成测试用例的图。 在实际编程中,我们可能会使用`PriorityQueue`来存储边并按权重排序,使用`...

    kr.rar_克鲁斯卡尔_克鲁斯卡尔算法

    在提供的kr.cpp文件中,应包含了克鲁斯卡尔算法的具体实现,可能包括读取图的边信息、边的排序、并查集的实现以及输出最小生成树的过程。通过分析和理解代码,可以更好地掌握克鲁斯卡尔算法的细节和实际应用。

    数据结构,最小生成树克鲁斯卡尔算法的实现.docx

    本文档描述的项目是使用C/C++编程语言实现克鲁斯卡尔算法,以构建最小生成树。最小生成树问题通常出现在网络连接优化场景中,例如在n个城市间建立通信网络,目标是以最低成本连接所有城市。克鲁斯卡尔算法就是解决这...

    图的最小生成树 普里姆算法+克鲁斯卡尔算法

    用C++实现的图的建立 以及用普里姆算法和克鲁斯卡尔算法求图的最小生成树

    数据结构,最小生成树克鲁斯卡尔算法的实现 (2).docx

    在C/C++编程中,实现克鲁斯卡尔算法通常包括以下步骤: - 定义结构体,如`struct Edge`,包含边的起始顶点、结束顶点和权重。 - 创建邻接矩阵,存储图的信息。 - 对所有边按照权重进行排序。 - 初始化一个空集合...

    图的最小生成树 利用普里姆算法和克鲁斯卡尔算法求网的最小生成树

    若要在n个城市之间建设通信网络,只需要架设n-1条线路即可。如何以最低的经济代价建设这个通信网,是一个网...(2)利用普里姆算法和克鲁斯卡尔算法求网的最小生成树; (3)按顺序输出生成树中各条边以及它们的权值。

Global site tag (gtag.js) - Google Analytics