C++用Prim算法实现无向图最小生成树
生活随笔
收集整理的這篇文章主要介紹了
C++用Prim算法实现无向图最小生成树
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#include <iostream>
using namespace std;
#define INFINE 99999999//假裝自己是無窮大
const int N = 1010;
int graph[N][N];
int vertexnum, arcnum;
//lowcost[i]:表示以i為終點的邊的最小權值,
//當lowcost[i]=0說明以i為終點的邊的最小權值=0,
//也就是表示i點加入了MST//mst[i]:表示對應lowcost[i]的起點,
//即說明邊<mst[i],i>是MST的一條邊
void Prim(int v, int n) {int sum = 0;int locatest[N];int mst[N];for (int i = 1; i <= n; i++) {locatest[i] = graph[v][i];mst[i] = v;}mst[v] = 0;locatest[v] = 0;for (int i = 2; i <= n; i++) {int minx = INFINE;int minid = 0;for (int k = 1; k <= n; k++) {if (locatest[k] != 0 && locatest[k] < minx) {minx = locatest[k];minid = k;}}cout << "V" << mst[minid] << "-" << "V" << minid << " = " << minx << endl;locatest[minid] = 0;sum += minx;for (int i = 1; i <= n; i++) {if ( graph[minid][i] < locatest[i]) {locatest[i] = graph[minid][i];mst[i] = minid;}}}cout << sum << endl;return;
}void CreateGraph() {cin >> vertexnum >> arcnum;//輸入點的個數,邊的條數for (int i = 1; i <= vertexnum; i++)for (int j = 1; j <= vertexnum; j++)graph[i][j] = INFINE;for (int i = 1; i <= arcnum; i++) {int a, b, w;cin >> a >> b >> w;graph[a][b] = w;//無向圖,故兩邊都要賦值graph[b][a] = w;}
}int main() {CreateGraph();Prim(1, vertexnum);//以點1為最小生成樹的起點return 0;
}
最小生成樹Prim算法理解地址:
https://blog.csdn.net/yeruby/article/details/38615045
總結
以上是生活随笔為你收集整理的C++用Prim算法实现无向图最小生成树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [召集令]-Dijkstra的单源最短路
- 下一篇: 我的世界飞机怎么开