21xrx.com
2024-12-22 22:23:22 Sunday
登录
文章检索 我的文章 写文章
【C++代码】Prim算法
2023-07-05 02:48:05 深夜i     --     --
C++ Prim算法 图论 最小生成树 堆优化

Prim算法是一种用于求解最小生成树的经典算法,它的核心思想是贪心策略。在Prim算法中,我们会先选择一个节点作为起点,然后不断地向周围的节点延伸,选择与当前节点相距最近的节点,并将其加入到生成树中。在此基础上,再继续延伸,不断地向周围的节点拓展,直到所有的节点都被加入到生成树中为止。

下面是用C++语言实现Prim算法的示例代码:


#include <iostream>

#include <cstring>

using namespace std;

const int MAXN = 100;

const int INF = 0x3f3f3f3f;

int graph[MAXN][MAXN]; // 存储图的邻接矩阵

int dis[MAXN]; // 存储到树的距离

bool vis[MAXN]; // 标记已经加入到生成树中的节点

int prim(int n)

{

  memset(dis, INF, sizeof(dis));

  memset(vis, false, sizeof(vis));

  dis[0] = 0;

  int res = 0;

  for (int i = 0; i < n; i++) {

    int u = -1;

    for (int j = 0; j < n; j++) {

      if (!vis[j] && (u == -1 || dis[j] < dis[u]))

        u = j;

      

    }

    if (u == -1)

      return -1;

    

    vis[u] = true;

    res += dis[u];

    for (int v = 0; v < n; v++) {

      if (!vis[v] && graph[u][v] < dis[v]) {

        dis[v] = graph[u][v];

      }

    }

  }

  return res;

}

int main()

{

  int n, m;

  cin >> n >> m;

  memset(graph, INF, sizeof(graph));

  for (int i = 0; i < m; i++) {

    int u, v, w;

    cin >> u >> v >> w;

    graph[u - 1][v - 1] = graph[v - 1][u - 1] = w;

  }

  int res = prim(n);

  cout << res << endl;

  return 0;

}

在上述代码中,我们首先定义了一个邻接矩阵来存储图的信息,即 `graph` 数组。接着定义了一个 `dis` 数组,用来记录到生成树的距离。另外,我们还定义了一个 `vis` 数组,用来标记已经加入到生成树中的节点。

在 `prim` 函数中,我们首先对 `dis` 数组和 `vis` 数组进行初始化,并将生成树的根节点设置为第一个节点。接着,我们循环遍历所有节点,找出与当前节点距离最近的未加入到生成树的节点,并将其加入到生成树中。

在加入新节点之后,我们需要再次更新 `dis` 数组,即找出与当前节点相邻的未加入生成树的节点,并计算出它们到生成树的距离。这里,我们使用贪心的策略,选择距离最近的未加入节点,并将其加入到生成树中。

最终,我们返回生成树的权值和,即可得到最小生成树。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复