C++實現Prim演算法
1,基本原理
MST性質:設 N =(V,E)是一個連通圖,U是頂點集V的一個非空子集。若邊(u,v)是一條具有最小權值的邊,其中u屬於U,v屬於V-U,則必存在一棵包含邊(u,v)的最小生成樹。
舉例:
如圖,從v1點開始,將v1點加入到U中,尋找從U到V-U的權值最小的邊,為1,將v3加入U中,再次尋找從U到V-U的權值最小的邊,為2,將v4加入到U中,再次尋找從U到V-U的權值最小的邊,為2,將v5加入到U中,再次尋找從U到V-U的權值最小的邊,為3,將v2加入到U中,最小生成樹完成。結果如下:
2,具體程式碼實現
注:這裡因為把各個資料組都定義在了Prim函式裡,所以顯得函式體比較臃腫,其實主要程式碼只有兩部分,一是更新從U到V-U中各點的最短邊,二是尋找從U到V-U的最短邊。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define Max 999999
void Prim(vector<vector<int> > V)
{
vector<int> d; //記錄從U到V-U中各點的最短邊
vector<int> U; //記錄被加入到U中的點
vector<bool> visited; //記錄點是否被加入U中
vector<int> M; //記錄最終得到的各條邊
d.resize(V.size());
visited.resize(V.size());
fill(visited.begin(), visited.end(), false);
U.push_back(0);
visited[0] = true;
fill(d.begin(), d.end(), Max);
d[0] = 0;
while (U.size() < V.size())
{
int x = U[U.size() - 1];
for (int i = 0; i < d.size(); ++i) //更新從U到V-U中各點的最短邊
{
if (!visited[i] && V[x][i] < d[i])
{
d[i] = V[x][i];
}
}
int min = Max;
int index = 0;
for (int i = 0; i < d.size(); ++i) //尋找從U到V-U的最短邊
{
if (d[i] < min && !visited[i])
{
min = d[i];
index = i;
}
}
if (index == 0)
{
cout << "該圖不連通" << endl;
return;
}
visited[index] = true;
U.push_back(index);
M.push_back(min);
}
for (int i = 0; i < M.size(); ++i) //輸出所得最小生成樹的各條邊
{
cout << M[i] << " ";
}
}
int main()
{
int n = 0;
int m = 0;
int u, v, w;
cout << "輸入節點個數:" << endl;
cin >> n;
cout << "輸入邊數:" << endl;
cin >> m;
vector<vector<int> > V;
V.resize(n);
for (int i = 0; i < n; ++i)
{
V[i].resize(n);
for (int j = 0; j < n; ++j)
{
V[i][j] = Max;
}
}
cout << "輸入各條邊的資訊:" << endl;
for (int i = 0; i < m; ++i)
{
cin >> u >> v >> w;
V[u][v] = V[v][u] = w;
}
Prim(V);
return 0;
}
輸入輸出資訊:
相關文章
- 最小生成樹的性質與prim演算法(C++實現)演算法C++
- 最小生成樹,Prim演算法與Kruskal演算法,408方向,思路與實現分析演算法
- 普里姆(Prim)演算法演算法
- 快速排序演算法C++實現排序演算法C++
- 最小生成樹__Prim演算法演算法
- 圖解Prim&Kruskal演算法圖解演算法
- MD5演算法--C++實現演算法C++
- 遺傳演算法與C++實現演算法C++
- 最小生成樹之 Prim 演算法演算法
- c++實現的模擬退火演算法C++演算法
- C++實現蠻力最近對演算法C++演算法
- 利用 C++ 實現 md5 演算法C++演算法
- 各類排序演算法的c++實現排序演算法C++
- NDT演算法詳解與C++實現演算法C++
- 最小生成樹——Prim演算法和Kruscal演算法演算法
- 最小生成樹:Kruskal演算法和Prim演算法演算法
- 最小生成樹-Prim演算法和Kruskal演算法演算法
- 最小生成樹之Prim演算法和Kruskal演算法演算法
- 最小生成樹prim普里姆演算法演算法
- 演算法基礎 第5版 第四章 最小生成樹Prim方法的Ruby實現演算法
- Dijkstra演算法和Prim演算法有什麼區別?演算法
- 設計模式——原型模式(C++)——演算法實現設計模式原型C++演算法
- DES演算法C++程式碼實現-密碼學演算法C++密碼學
- Prim‘s algorithm : 求一個Graph的MST的C++版本GoC++
- 【JAVA演算法】圖論演算法 --求最小生成樹Prim演算法Java演算法圖論
- 常見快取演算法和LRU的c++實現快取演算法C++
- 使用OpenCV和C++實現的分水嶺演算法(Watershed)OpenCVC++演算法
- poj1258--資料結構prim演算法資料結構演算法
- [C++]實現memcpyC++memcpy
- C++ binder 實現C++
- 資料結構與演算法——B樹的C++實現資料結構演算法C++
- Boyer-Moore 精確匹配演算法實現(C/C++)演算法C++
- DPLL 演算法(求解k-SAT問題)詳解(C++實現)演算法C++
- 決策樹ID3分類演算法的C++實現演算法C++
- 演算法:如何使用C++實現一個簡單的集合類演算法C++
- 資料結構與演算法——AVL樹類的C++實現資料結構演算法C++
- Visual C++數字影象處理典型演算法及實現C++演算法
- 資料結構與演算法——無權最短路徑演算法的C++實現資料結構演算法C++