21xrx.com
2025-03-27 16:55:06 Thursday
文章检索 我的文章 写文章
【C++代码】Prim算法
2023-07-05 02:48:05 深夜i     18     0
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` 数组,即找出与当前节点相邻的未加入生成树的节点,并计算出它们到生成树的距离。这里,我们使用贪心的策略,选择距离最近的未加入节点,并将其加入到生成树中。

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

  
  

评论区