引言Prim算法是一种用于寻找加权无向图中最短路径的贪心算法。它从图中的一个顶点开始,逐步扩展到其他顶点,直到所有顶点都被包含在生成的最小生成树中。本文将详细介绍Prim算法的原理、实现过程以及在C语...
Prim算法是一种用于寻找加权无向图中最短路径的贪心算法。它从图中的一个顶点开始,逐步扩展到其他顶点,直到所有顶点都被包含在生成的最小生成树中。本文将详细介绍Prim算法的原理、实现过程以及在C语言中的具体应用。
Prim算法的基本思想是:从图中的一个顶点开始,逐步选择距离当前顶点最近的顶点,将其加入到已选择的顶点集合中,直到所有顶点都被包含在最小生成树中。
算法步骤如下:
以下是一个使用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算法有了深入的了解。在实际应用中,你可以根据需要修改算法参数,以便更好地解决实际问题。希望本文能帮助你轻松掌握无向图最短路径计算技巧。