当前位置: 首页 > news >正文

最小生成树的普利姆算法和克鲁斯卡尔算法

最小生成树的普利姆算法和克鲁斯卡尔算法

最小生成树的概念:指含有图中全部顶点的极小连通子树,包含所有顶点n,但只有足以构成一棵树的n-1条边

求最小生成树可以采用普利姆算法和克鲁斯卡尔算法
以下图为例
在这里插入图片描述
先构造带权图

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
#define MAX 0x7fffffff
typedef char VertexType;
typedef int EdgeType;
typedef struct
{//顶点数组VertexType vertex[MAXSIZE];//边的二维数组EdgeType arc[MAXSIZE][MAXSIZE];int Vertex_num;int Edge_num;
}Mat_graph;
int visit[MAXSIZE];
//构建带权图
void creat_graph(Mat_graph* G)
{G->Vertex_num = 9;G->Edge_num = 15;G->vertex[0] = 'A';G->vertex[1] = 'B';G->vertex[2] = 'C';G->vertex[3] = 'D';G->vertex[4] = 'E';G->vertex[5] = 'F';G->vertex[6] = 'G';G->vertex[7] = 'H';G->vertex[8] = 'I';for (int i = 0;i < G->Vertex_num;i++){for (int j = 0;j < G->Vertex_num;j++){if (i == j){G->arc[i][j] = 0;}else{G->arc[i][j] = MAX;}}}G->arc[0][1] = 10;G->arc[0][5] = 11;G->arc[1][2] = 18;G->arc[1][6] = 16;G->arc[1][8] = 12;G->arc[2][3] = 22;G->arc[2][8] = 8;G->arc[3][4] = 20;G->arc[3][6] = 24;G->arc[3][7] = 16;G->arc[3][8] = 21;G->arc[4][5] = 26;G->arc[4][7] = 7;G->arc[5][6] = 17;G->arc[6][7] = 19;for (int i = 0;i < G->Vertex_num;i++){for (int j = 0;j < G->Vertex_num;j++){G->arc[j][i] = G->arc[i][j];}}
}

普利姆算法
普利姆算法:从一个顶点开始,每次比较待选的所有路径,并选择最小的路径,直到每个顶点都遍历一遍
代码实现

//普利姆算法
void  prim(Mat_graph* G)
{int i, j, k;int min;//待比较的权值int weight[MAXSIZE];//记录边,数组中的值表示出发点,数组下标表示到达点int index[MAXSIZE];for (i = 0;i < G->Vertex_num;i++){weight[i] = G->arc[0][i];index[i] = 0;}for (int i = 1;i < G->Vertex_num;i++){min = MAX;j = 0;k = 0;while (j < G->Vertex_num){if (weight[j] != 0 && weight[j] < min){min = weight[j];k = j;}j++;}printf("(%c,%c)\n", G->vertex[index[k]], G->vertex[k]);weight[k] = 0;//比较新的结点的权值,并把边记录下去for (int j = 0;j < G->Vertex_num;j++){if (weight[j] != 0 && G->arc[k][j] < weight[j]){weight[j] = G->arc[k][j];index[j] = k;}}}
}

主函数

int main()
{Mat_graph G;creat_graph(&G);prim(&G);printf("\n");return 0;
}

运行结果

克鲁斯卡尔算法
克鲁斯卡尔算法是对边进行操作,先找权值最小的边,在依次选择,但要注意避免形成回路
代码如下
其中构造带权图的代码和上面一样

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
#define MAX 0x7fffffff
typedef char VertexType;
typedef int EdgeType;
typedef struct
{//顶点数组VertexType vertex[MAXSIZE];//边的二维数组EdgeType arc[MAXSIZE][MAXSIZE];int Vertex_num;int Edge_num;
}Mat_graph;
//边的存储
typedef struct
{int begine;int end;int weight;
}Edge;
//交换
void swap(Edge* a, Edge* b)
{Edge temp;temp = *a;*a = *b;*b = temp;
}
//将边数组从小到大进行排序
void sortEdge(Edge edgh[], int edge_num)
{for (int i = 0;i < edge_num;i++){for (int j = i + 1;j < edge_num;j++){if (edgh[i].weight > edgh[j].weight){swap(&edgh[i], &edgh[j]);}}}
}
//避免形成回路
int find(int* parent, int index)
{while (parent[index] > 0){index = parent[index];}return index;
}
//克鲁斯卡尔算法
void Kruskal(Mat_graph* G)
{Edge edgh[MAXSIZE];int k = 0;for (int i = 0;i < G->Vertex_num;i++){for (int j = i+1;j < G->Vertex_num;j++){if (G->arc[i][j] < MAX){edgh[k].begine = i;edgh[k].end = j;edgh[k].weight = G->arc[i][j];k++;}		}}sortEdge(&edgh, G->Edge_num);int parent[MAXSIZE];for (int i = 0;i < G->Vertex_num;i++){parent[i] = 0;}int m, n;for (int i = 0;i < G->Edge_num;i++){m = find(parent, edgh[i].begine);n = find(parent, edgh[i].end);if (m != n){parent[m] = n;printf("(%c,%c) %d\n", G->vertex[edgh[i].begine], G->vertex[edgh[i].end], edgh[i].weight);}}
}

主函数

int main()
{Mat_graph G;creat_graph(&G);Kruskal(&G);printf("\n");return 0;
}

运行结果

在最小生成树中,库鲁斯卡尔算法针对边进行操作,适合边数少的情况。而普里斯算法针对顶点,适用于边数多的情况

http://www.dtcms.com/a/343517.html

相关文章:

  • ABP vNext 速率限制在多租户场景落地
  • Leetcode 深度优先搜索 (13)
  • Leetcode 深度优先搜索 (12)
  • 20250821 圆方树总结
  • 通信基础理论
  • C语言基础习题——01
  • plantsimulation小知识25.08.21 对话框的使用方法
  • 深圳大学-计算机信息管理课程实验 C++ 自考模拟题
  • 【LeetCode】18. 四数之和
  • C语言:字符函数与字符串函数(2)
  • ORA-16331: container is not open ORA-06512: at “SYS.DBMS_LOGMNR“
  • Hexo 博客图片托管:告别本地存储,用 PicGo + GitHub 打造高速稳定图床
  • ArcMap 数据框裁剪(Data Frame Clip)操作教程
  • Service方法事务失效的原因是什么?
  • 2025-08-21 Python进阶8——命名空间作用域
  • PiscCode实现MediaPipe 的人体姿态识别:三屏可视化对比实现
  • 算法题Day4
  • WaitForSingleObject函数详解
  • JavaScript 性能优化实战技术文章大纲
  • C++手撕LRU
  • 中国之路 向善而行 第三届全国自驾露营旅游发展大会在阿拉善启幕
  • Webpack的使用
  • 5.Shell脚本修炼手册---Linux正则表达式(Shell三剑客准备启动阶段)
  • AI 时代的 “人机协作”:人类与 AI 如何共塑新生产力
  • 7.Shell脚本修炼手册---awk基础入门版
  • camel中支持的模型与工具
  • 爬虫基础学习-POST方式、自定义User-Agent
  • FCN网络结构讲解与Pytorch逐行讲解实现
  • 小程序个人信息安全检测技术:从监管视角看加密与传输合规
  • 限流技术:从四大限流算法到Redisson令牌桶实践