📜  Prim 算法(邻接矩阵表示的简单实现)(1)

📅  最后修改于: 2023-12-03 15:03:51.870000             🧑  作者: Mango

Prim算法(邻接矩阵表示的简单实现)

介绍

Prim算法是一种构建最小生成树的贪心算法,用来解决连通图的最小生成树问题。它通过贪心的方式每次选取与当前生成树相邻的最小边加入生成树中,最终得到最小生成树。该算法时间复杂度为O(E log V),其中E为图中边的数量,V为图中节点的数量。本文实现的Prim算法使用邻接矩阵表示图,并使用C++编程语言进行实现。

算法过程
  1. 初始化一个空的生成树,包含任意一个节点;
  2. 扫描当前生成树的所有节点,选择一个距离其最近的未使用节点,将与该节点相邻的边加入生成树;
  3. 重复步骤2,直到生成树包含所有节点为止。
代码实现
const int INF = 0x3f3f3f3f; // 定义一个正无穷的值

void Prim(int graph[MAX][MAX], int n) {
    bool visited[MAX];  // 标记节点是否已加入生成树
    int parent[MAX];    // 存储节点的父节点,用于输出最小生成树
    int distance[MAX];  // 存储节点到生成树的距离

    // 初始化visited数组和distance数组
    for (int i = 0; i < n; i++) {
        visited[i] = false;
        distance[i] = INF;
    }

    // 将任一节点加入生成树中,并设置距离为0
    distance[0] = 0;
    parent[0] = -1;

    // 遍历所有节点,加入生成树
    for (int i = 0; i < n - 1; i++) {
        // 选择当前距离生成树最近的节点
        int u, min_distance = INF;
        for (int j = 0; j < n; j++) {
            if (!visited[j] && distance[j] < min_distance) {
                u = j;
                min_distance = distance[j];
            }
        }

        visited[u] = true;

        // 更新节点到生成树的距离
        for (int v = 0; v < n; v++) {
            if (graph[u][v] && !visited[v] && graph[u][v] < distance[v]) {
                parent[v] = u;
                distance[v] = graph[u][v];
            }
        }
    }

    // 输出最小生成树
    for (int i = 1; i < n; i++) {
        cout << parent[i] << " - " << i << " : " << graph[i][parent[i]] << endl;
    }
}
示例

为了演示Prim算法的实现过程,假设我们有如下无向图(邻接矩阵表示):

0 2 0 6 0
2 0 3 8 5
0 3 0 0 7
6 8 0 0 9
0 5 7 9 0

运行Prim算法后,输出如下最小生成树:

0 - 1 : 2
1 - 2 : 3
0 - 3 : 6
1 - 4 : 5
总结

以上是Prim算法在邻接矩阵表示下的简单实现,该算法是一种经典的最小生成树算法,具有简单、高效、正确性等优点,在实际应用中得到广泛的使用。