最小生成树 - C 语言克鲁斯卡尔算法 / C++ 代码实现
1. Kruskal算法简介
Kruskal算法是一种用于查找最小生成树的算法(用于查找带权连通图的最小生成树的算法)。在所有剩余的未选择的边中,找到最小的边。如果它与选定的边形成循环,则向上并选择下一个最小的边。
具体操作过程为:
a) 移除图中所有连接线,只留下顶点
b) 从图的边集数组中找到权重最小的边,并将两条边合并边连接角
c) 继续寻找权重最小的边并连接两个顶点。如果所选边在最小生成树中导致环路,则丢弃该边并选择权重次小的边。
d) 直到所有顶点都连通且不存在环路时,最小生成树就生成了。
2。两个核心问题
问题1 将图的所有边按照权重进行排序。
问题2:在最小生成树中添加边时,如何判断是否形成环路。
问题可以直接用排序算法进行排序。
问题2的核心思想是记录处理。处理方法是:在“最小生成树”中记录该顶点的结束点。顶点的端点是“与最小生成树中的顶点相连的最大顶点”。然后每次需要向最小生存树添加一条边时,就判断该边的两个顶点的端点是否重合。如果它们重叠,就会形成一个环。 ? ♿ 0; i numvertex; i++) {struct Edge { int/ /边缘的起点int结束; //边的终点 typedef struct Graph { char MAXVERTEX];顶点 边缘边缘[MAXEDGE]; //第页int numvertex,numedges;//顶点数和边数} MGraph;CreateGraph(MGraph* G) { printf(”请输入顶点和边缘的数量:\ n“););”%d%d“,&g-> numvertex, &G->numedges); printf("请输入顶点:\n"❀); getchar();//用这个函数去掉我们在输入末尾打印的回车符 intscanf("%c", &G->顶点[i]); ? ; = 0; k 数字; k++) { edge G->kanten[k] = e; }}int 查找 (int *parent, int (parent[f]>0) { ___ void Kruskal(MGraph *G) { parent[MAXVERTEX];//更大的最小值生成树 的顶点 (int❿❿i-❓i-❓i-❓) 父母[i] = 0; int m, n; (int i = 0; i numedges; i++) { n = Find(parent, G->edges[i].begin); (m , G->edges[i].end); 当 ( n != m) { //❙❙❙❙ parent[ n] = m; printf((%d,%d) %d\t" , G->begin,[i].->edges[i].end, G->edges[i].wight);//打印边和权重 } int- Kruskal(&G); 返回}
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网