21xrx.com
2024-12-23 00:34:45 Monday
登录
文章检索 我的文章 写文章
C++语言实现prim算法
2023-07-07 07:06:28 深夜i     --     --
C++ Prim算法 图论 最小生成树 堆数据结构

Prim算法是一种最小生成树算法,它是由J. Prim在1957年提出的。C++是一个广泛使用的编程语言,它具有良好的可移植性和高效的运行速度。在C++中实现Prim算法,可以有效地解决最小生成树问题。

首先,了解Prim算法的基本思路。Prim算法从图的一个连通给定节点开始,构造一个连通子图,一次加入一个与该连通子图相邻的权值最小的边,直到加入n-1条边形成一棵最小生成树。这个过程可以使用堆等数据结构来加速。

然后,根据Prim算法的思路,使用C++语言实现Prim算法。首先,定义一个Heap类,用于维护一个含有未加入子图的所有边的堆。在堆中,每个边与一个权重相关联,以便可以快速找到最小的边。建立好了堆之后,从任何给定的初始节点开始,选择一个最小权重的边,并将此边添加到最小生成树列表中。

在C++中实现Prim算法的实现过程如下:


#include <iostream>

#include <vector>

#include <queue>

#include <utility>

#include <functional>

using namespace std;

typedef pair<int, int> pii;

const int MAXN = 100010;

int N, M;

vector<pair<int, int> > G[MAXN];

priority_queue<pii, vector<pii>, greater<pii> > pq;

bool vis[MAXN];

void prim() {

  int mn = 0;

  pq.push(make_pair(0, 1));

  while (!pq.empty()) {

    pii e = pq.top(); pq.pop();

    if (vis[e.second]) continue;

    vis[e.second] = true;

    mn += e.first;

    for (int i = 0; i < G[e.second].size(); i++) {

      int v = G[e.second][i].first, w = G[e.second][i].second;

      if (!vis[v]) pq.push(make_pair(w, v));

    }

  }

  cout << mn << endl;

}

int main() {

  cin >> N >> M;

  for (int i = 1; i <= M; i++) {

    int u, v, w;

    cin >> u >> v >> w;

    G[u].push_back(make_pair(v, w));

    G[v].push_back(make_pair(u, w));

  }

  prim();

  return 0;

}

在这段代码中,我们首先定义了一个Heap类,用于维护一个含有所有未加入子图的边的堆。具体而言,我们使用std::priority_queue类来实现堆,其中pair类用于存储边与权重的对。然后,我们从任意一个节点开始,找到一个最小权重的边,并将其添加到最小生成树中。这个过程重复n-1次,直到所有的边都添加到了最小生成树中。

总之,在C++中实现Prim算法是一个有趣且有用的项目。通过这个项目,我们可以进一步加深对Prim算法的理解,并掌握C++编程的相关技能。

  
  

评论区

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