
第12周 【项目1 - 验证算法】
初始化:选择一个顶点v作为起点,并将它加入最小生成树U。 对剩余的顶点进行排序,找到当前未包含在U中的顶点与已在U中的最近顶点之间的边。 将这条边加入生成树,并将该边连接的顶点加入U。 重复步骤2直到所有顶点都被包含在U中。 对图中所有边按照权重从小到大排序。 初始化并列的边集,并标记哪些边已经被选中。 遍历所有边,依次选取连接两个不同连通部分的边,加入生成树,并将那两个连通部分合并。 当所有顶点都被连接时,停止并收集形成的生成树边。
发布日期:2021-05-24 13:03:23
浏览次数:16
分类:精选文章
本文共 1952 字,大约阅读时间需要 6 分钟。
最小生成树的普里姆算法和克鲁斯卡尔算法
最小生成树是多重图中连接所有顶点的边的子集,且该子集中任意两顶点之间都有一条 edges ,并且边的权重之和最小。找到最小生成树的算法有两种主要方法:普里姆算法和克鲁斯卡尔算法。本文将详细介绍这两种算法的实现方法。
普里姆算法的基本思路是通过“枚举”法一步步加入最小边,直到形成包含所有顶点的树。具体步骤如下:
以下是普里姆算法在代码中的实现示例:
#include#include #include "graph.h"void Prim(MGraph g, int v) { int lowcost[MAXV]; // 是否包含顶点i int min; int closest[MAXV], i, j, k; for (i = 0; i < MAXV; i++) { lowcost[i] = INFINITY; } closest[v] = 0; lowcost[v] = 0; for (i = 0; i < MAXV; i++) { min = INFINITY; j = v; for (k = 0; k < MAXV; k++) { if (lowcost[k] < lowcost[j]) { min = lowcost[k]; j = k; } } for (k = 0; k < MAXV; k++) { if (lowcost[k] == min) { closest[k] = j; lowcost[k] += weight[ j ][ k ]; } } }}
克鲁斯卡尔算法则通过“裁剪”现有的边来构建生成树。其基本步骤如下:
具体代码实现如下:
#include#include #include "graph.h"void Kruskal(MGraph g, int n) { Edge edges[MAXEDGES]; int i, j, k, min_edge_weight; Edgesort(edges, n, min_edge_weight); int Uindx[MAXV], Vindx[MAXV]; Uindx[n] = Vindx[n] = -1; for (j = 1; j < n; j++) { for (i = 0; i < edges[j].v; i++) { if (Uindx[edges[i].u] == -1 && Vindx[edges[i].v] == -1) { Uindx[edges[i].u] = Uindx[edges[i].v] = ++current_union; } else if (Uindx[edges[i].u] > Uindx[edges[i].v]) { Uindx[edges[i].u] = Vindx[edges[i].v]; } else { Vindx[edges[i].v] = Uindx[edges[i].u]; } } }}
注:Edgesort
和相关辅助函数负责对边按权重排序和管理并查集。
整个算法的实现核心在于如何高效地维护边的访问状态和连通部分。若图规模较大,可进一步优化数据结构以提升性能。
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年04月18日 05时37分48秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
查找最小值栈的O(1)
2019-03-15
Java面试题整理,闭关在家37天“吃透”这份345页PDF,纯干货
2019-03-15
概念唱片Plastic Beach封面高清壁纸
2019-03-15
旅游后期效果Ography Lightroom预设
2019-03-15
LINUX-WIFI无线接入的一些东西
2019-03-15
word文档手写字母总会大写问题
2019-03-15
Redis中的key
2019-03-15
juc-09-控制并发流程工具类
2019-03-15
第一节 docker安装
2019-03-15
Spring 和 DI 依赖注入
2019-03-15
中序线索二叉树的遍历
2019-03-15
laravel server error 服务器内部错误
2019-03-15
Linux驱动实现GPIO模拟I2C读写操作
2019-03-15
iJ配置Maven环境详解
2019-03-15
仿QQ登陆界面
2019-03-15
N皇后问题解法(递归+回朔)
2019-03-15
面试题 08.01. 三步问题
2019-03-15
剑指 Offer 11. 旋转数组的最小数字
2019-03-15
word文档注入(追踪word文档)未完
2019-03-15
作为我的第一篇csdn博客吧
2019-03-15