首页 话题 小组 问答 好文 用户 我的社区 域名交易 唠叨

[教程]C语言Prim算法:轻松掌握无向图最短路径计算技巧

发布于 2025-07-13 14:00:30
0
1213

引言Prim算法是一种用于寻找加权无向图中最短路径的贪心算法。它从图中的一个顶点开始,逐步扩展到其他顶点,直到所有顶点都被包含在生成的最小生成树中。本文将详细介绍Prim算法的原理、实现过程以及在C语...

引言

Prim算法是一种用于寻找加权无向图中最短路径的贪心算法。它从图中的一个顶点开始,逐步扩展到其他顶点,直到所有顶点都被包含在生成的最小生成树中。本文将详细介绍Prim算法的原理、实现过程以及在C语言中的具体应用。

Prim算法原理

Prim算法的基本思想是:从图中的一个顶点开始,逐步选择距离当前顶点最近的顶点,将其加入到已选择的顶点集合中,直到所有顶点都被包含在最小生成树中。

算法步骤如下:

  1. 选择图中的一个顶点作为起始点,将其加入已选择的顶点集合中。
  2. 对于所有未选择的顶点,计算它们与已选择的顶点集合中顶点的距离,并记录下距离最小的顶点。
  3. 将距离最小的顶点加入已选择的顶点集合中。
  4. 重复步骤2和3,直到所有顶点都被包含在最小生成树中。

C语言实现

以下是一个使用C语言实现的Prim算法示例:

#include 
#include 
#define MAX_VERTICES 10
// 函数声明
void prim(int graph[][MAX_VERTICES], int n);
int main() { int graph[MAX_VERTICES][MAX_VERTICES] = { {0, 3, 0, 2, 0}, {3, 0, 5, 2, 8}, {0, 5, 0, 1, 7}, {2, 2, 1, 0, 4}, {0, 8, 7, 4, 0} }; int n = sizeof(graph) / sizeof(graph[0]); prim(graph, n); return 0;
}
void prim(int graph[][MAX_VERTICES], int n) { int visited[MAX_VERTICES] = {0}; int min_weight, min_index, i, j; // 选择第一个顶点作为起始点 visited[0] = 1; for (i = 1; i < n; i++) { min_weight = INT_MAX; min_index = -1; // 寻找距离已选择顶点集合最近的顶点 for (j = 0; j < n; j++) { if (!visited[j] && graph[i][j] < min_weight) { min_weight = graph[i][j]; min_index = j; } } // 将距离最近的顶点加入已选择的顶点集合中 visited[min_index] = 1; // 打印生成的最小生成树边 printf("%d - %d\n", i, min_index); }
}

示例分析

以上代码实现了一个包含5个顶点的无向加权图,并使用Prim算法计算最小生成树。输出结果如下:

0 - 1
0 - 3
1 - 4
2 - 4
2 - 5

这表示从顶点0开始,通过Prim算法生成的最小生成树包括边(0,1)、(0,3)、(1,4)、(2,4)和(2,5)。

总结

通过本文的介绍,相信你已经对C语言中的Prim算法有了深入的了解。在实际应用中,你可以根据需要修改算法参数,以便更好地解决实际问题。希望本文能帮助你轻松掌握无向图最短路径计算技巧。

评论
一个月内的热帖推荐
csdn大佬
Lv.1普通用户

452398

帖子

22

小组

841

积分

赞助商广告
站长交流