Prim算法构造最小生成树数据结构实验以c➕➕语言为例用三元组输出最小生成树的边及权值(vi,w,vj),vi和vj代表顶点,w代表边对应的权值
时间: 2023-07-22 09:19:36 浏览: 102
数据结构实验 Prim最小生成树
好的,我会尽力解答您的问题。
首先,我需要说明的是,Prim算法是一种构建最小生成树的算法,它的核心思想是从一个点开始,每次选择与已经选中的点距离最近的点,直到所有点都被选中为止。
下面是用C++语言实现Prim算法构建最小生成树的代码:
```c++
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
const int INF = 0x3f3f3f3f;
int n, m;
int head[MAXN], dis[MAXN], vis[MAXN], cnt;
struct edge
{
int to, w, nxt;
}e[MAXN << 1];
void add(int u, int v, int w)
{
e[++cnt].to = v;
e[cnt].w = w;
e[cnt].nxt = head[u];
head[u] = cnt;
}
void Prim()
{
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
for(int i = 1; i <= n; ++i) dis[i] = INF;
dis[1] = 0;
pq.push(make_pair(0, 1));
while(!pq.empty())
{
int u = pq.top().second;
pq.pop();
if(vis[u]) continue;
vis[u] = 1;
for(int i = head[u]; i; i = e[i].nxt)
{
int v = e[i].to, w = e[i].w;
if(!vis[v] && dis[v] > w)
{
dis[v] = w;
pq.push(make_pair(dis[v], v));
}
}
}
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= m; ++i)
{
int u, v, w;
cin >> u >> v >> w;
add(u, v, w);
add(v, u, w);
}
Prim();
int ans = 0;
for(int i = 1; i <= n; ++i) ans += dis[i];
cout << ans << endl;
for(int i = 2; i <= n; ++i) cout << i << " " << dis[i] << " " << 1 << endl;
return 0;
}
```
在这段代码中,我们使用了邻接表存储图,并使用了优先队列来实现Prim算法。首先,我们初始化dis数组为INF,表示每个点到生成树的距离都是无穷大。然后,我们将起点1插入到优先队列中,并将dis[1]设为0。接着,我们不断从优先队列中取出距离最小的点,将它标记为已经访问过,并更新与它相邻的点的距离。最后,我们统计生成树的边权之和,并输出生成树的边及权值。
需要注意的是,这段代码只输出了最小生成树的边及权值,没有使用三元组输出。如果您需要使用三元组输出,可以将输出语句修改为:
```c++
for(int i = 2; i <= n; ++i) cout << 1 << " " << i << " " << dis[i] << endl;
```
这样就可以输出形如(v1,w,v2)的三元组了。
阅读全文