用C语言编程实现构建最小生成树的两种算法,可以动态输入并有运行截图,带有解释代码

时间: 2024-02-01 22:13:33 浏览: 21
好的,下面是两种构建最小生成树的算法的C语言实现: 1. Prim算法 Prim算法是一种贪心算法,可以用来构建最小生成树。它的基本思想是从一个起始节点开始,每次选择一个与当前生成树相邻且权值最小的节点加入到生成树中,直到所有节点都被加入。 下面是Prim算法的C语言实现: ```c #include <stdio.h> #include <stdlib.h> #include <limits.h> #define MAXV 1000 typedef struct { int y; int weight; struct edgenode *next; } edgenode; typedef struct { edgenode *edges[MAXV+1]; int degree[MAXV+1]; int nvertices; int nedges; int directed; } graph; void initialize_graph(graph *g) { int i; g -> nvertices = 0; g -> nedges = 0; g -> directed = 0; for (i = 1; i <= MAXV; i++) { g -> degree[i] = 0; g -> edges[i] = NULL; } } void insert_edge(graph *g, int x, int y, int weight, int directed) { edgenode *p = malloc(sizeof(edgenode)); p -> y = y; p -> weight = weight; p -> next = g -> edges[x]; g -> edges[x] = p; g -> degree[x]++; if (!directed) insert_edge(g, y, x, weight, 1); else g -> nedges++; } void prim(graph *g, int start) { int intree[MAXV+1]; int distance[MAXV+1]; int parent[MAXV+1]; int v, i, weight, dist; for (i = 1; i <= g -> nvertices; i++) { intree[i] = 0; distance[i] = INT_MAX; parent[i] = -1; } distance[start] = 0; v = start; while (intree[v] == 0) { intree[v] = 1; edgenode *p = g -> edges[v]; while (p != NULL) { int y = p -> y; int weight = p -> weight; if ((distance[y] > weight) && (intree[y] == 0)) { distance[y] = weight; parent[y] = v; } p = p -> next; } v = 1; dist = INT_MAX; for (i = 1; i <= g -> nvertices; i++) { if ((intree[i] == 0) && (dist > distance[i])) { dist = distance[i]; v = i; } } } for (i = 1; i <= g -> nvertices; i++) { if (parent[i] != -1) printf("%d - %d\n", parent[i], i); } } int main() { graph g; int n, m, x, y, w, i; printf("Enter number of vertices: "); scanf("%d", &n); printf("Enter number of edges: "); scanf("%d", &m); initialize_graph(&g); g.nvertices = n; for (i = 1; i <= m; i++) { printf("Enter edge %d (x, y, weight): ", i); scanf("%d %d %d", &x, &y, &w); insert_edge(&g, x, y, w, 0); } printf("Minimum spanning tree:\n"); prim(&g, 1); return 0; } ``` 上述代码中,我们先定义了一个图的结构体,包括每个节点的边和度数,还有一些其他属性。然后我们定义了三个数组,分别表示当前节点是否已经被加入到生成树中,当前节点到起始节点的距离,以及当前节点的父节点。 接着我们实现了一个函数 `initialize_graph`,用于初始化图的结构体。另外,我们还实现了一个函数 `insert_edge`,用于插入一条边。 最后,我们实现了Prim算法的函数 `prim`,它从起始节点开始,每次选择与当前生成树相邻且权值最小的节点加入到生成树中,直到所有节点都被加入。这里我们采用了一个数组 `intree` 来标记每个节点是否已经被加入到生成树中,一个数组 `distance` 来表示当前节点到起始节点的最短距离,以及一个数组 `parent` 来记录每个节点在生成树中的父节点。最后,我们输出生成树中的每条边。 2. Kruskal算法 Kruskal算法是另一种常用的构建最小生成树的算法,它的基本思想是先将所有边按照权值从小到大排序,然后依次加入到生成树中,如果加入一条边会形成环,则舍弃这条边。 下面是Kruskal算法的C语言实现: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXV 1000 #define MAXE 1000 typedef struct { int x; int y; int weight; } edge; typedef struct { int parent[MAXV+1]; int nvertices; edge edges[MAXE+1]; int nedges; } graph; void initialize_graph(graph *g, int n) { int i; g -> nvertices = n; g -> nedges = 0; for (i = 1; i <= n; i++) g -> parent[i] = i; } int find(int x, graph *g) { if (g -> parent[x] == x) return x; return find(g -> parent[x], g); } void union_sets(int x, int y, graph *g) { int rootx = find(x, g); int rooty = find(y, g); g -> parent[rootx] = rooty; } int compare(const void *a, const void *b) { edge *x = (edge *)a; edge *y = (edge *)b; return x -> weight - y -> weight; } void kruskal(graph *g) { int i, n, x, y; edge e; qsort(g -> edges, g -> nedges, sizeof(edge), compare); initialize_graph(g, g -> nvertices); for (i = 1; i <= g -> nedges; i++) { e = g -> edges[i]; x = e.x; y = e.y; if (find(x, g) != find(y, g)) { printf("%d - %d\n", x, y); union_sets(x, y, g); } } } int main() { graph g; int n, m, x, y, w, i; printf("Enter number of vertices: "); scanf("%d", &n); printf("Enter number of edges: "); scanf("%d", &m); g.nvertices = n; for (i = 1; i <= m; i++) { printf("Enter edge %d (x, y, weight): ", i); scanf("%d %d %d", &x, &y, &w); g.edges[i].x = x; g.edges[i].y = y; g.edges[i].weight = w; g.nedges++; } printf("Minimum spanning tree:\n"); kruskal(&g); return 0; } ``` 上述代码中,我们定义了一个结构体 `edge`,用于表示一条边的起点、终点和权值。我们还定义了一个图的结构体,包括每个节点的父节点和所有边,还有一些其他属性。 接着我们实现了一个函数 `initialize_graph`,用于初始化图的结构体。另外,我们还实现了两个函数 `find` 和 `union_sets`,用于实现并查集操作,判断加入一条边是否会形成环。 最后,我们实现了Kruskal算法的函数 `kruskal`,它先将所有边按照权值从小到大排序,然后依次加入到生成树中,如果加入一条边会形成环,则舍弃这条边。这里我们采用了并查集来判断是否形成环,输出生成树中的每条边。

最新推荐

recommend-type

c语言编程的几种排序算法比较

排序算法是一种基本并且常用的算法。由于实际工作中处理的数量巨大,所以排序算法 对算法本身的速度要求很高。 而一般我们所谓的算法的性能主要是指算法的复杂度,一般用O方法来表示。在后面我将 给出详细的说明。
recommend-type

最小生成树Prim算法朴素版 C语言实现

最小生成树Prim算法朴素版 C语言实现最小生成树Prim算法朴素版 C语言实现
recommend-type

C语言实现哈夫曼树的构建

主要为大家详细介绍了C语言实现哈夫曼树的构建,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

数据结构 最小生成树C代码

利用克鲁斯卡尔算法求网的最小生成树。要求:若要在n各城市之间建设通信网络,只需要架设n-1条线路即可。如何以最低的经济代价建设这个通信网络,是一个网的最小生成树问题。
recommend-type

基于AT89C51单片机的三电梯联动控制系统+全部资料+详细文档(高分项目).zip

【资源说明】 基于AT89C51单片机的三电梯联动控制系统+全部资料+详细文档(高分项目).zip基于AT89C51单片机的三电梯联动控制系统+全部资料+详细文档(高分项目).zip基于AT89C51单片机的三电梯联动控制系统+全部资料+详细文档(高分项目).zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

list根据id查询pid 然后依次获取到所有的子节点数据

可以使用递归的方式来实现根据id查询pid并获取所有子节点数据。具体实现可以参考以下代码: ``` def get_children_nodes(nodes, parent_id): children = [] for node in nodes: if node['pid'] == parent_id: node['children'] = get_children_nodes(nodes, node['id']) children.append(node) return children # 测试数
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。