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)演算法演算法
- 快速排序演算法C++實現排序演算法C++
- 最小生成樹,Prim演算法與Kruskal演算法,408方向,思路與實現分析演算法
- 最小生成樹__Prim演算法演算法
- 最小生成樹之 Prim 演算法演算法
- NDT演算法詳解與C++實現演算法C++
- C++實現蠻力最近對演算法C++演算法
- c++實現的模擬退火演算法C++演算法
- 最小生成樹-Prim演算法和Kruskal演算法演算法
- 最小生成樹:Kruskal演算法和Prim演算法演算法
- 最小生成樹——Prim演算法和Kruscal演算法演算法
- Dijkstra演算法和Prim演算法有什麼區別?演算法
- 演算法基礎 第5版 第四章 最小生成樹Prim方法的Ruby實現演算法
- 最小生成樹prim普里姆演算法演算法
- 設計模式——原型模式(C++)——演算法實現設計模式原型C++演算法
- 【JAVA演算法】圖論演算法 --求最小生成樹Prim演算法Java演算法圖論
- 常見快取演算法和LRU的c++實現快取演算法C++
- C++,Java,Python,Javascript實現二分查詢演算法C++PythonJavaScript演算法
- [C++]實現memcpyC++memcpy
- DPLL 演算法(求解k-SAT問題)詳解(C++實現)演算法C++
- c++實現Json庫C++JSON
- 堆排序(實現c++)排序C++
- 命令模式(c++實現)模式C++
- LinkBlockedQueue的c++實現BloCC++
- 堆排序c++實現排序C++
- 單例模式c++實現單例模式C++
- FastASR——PaddleSpeech的C++實現ASTC++
- 享元模式(c++實現)模式C++
- 狀態模式(c++實現)模式C++
- 中介者模式(c++實現)模式C++
- 模板方法模式(c++實現)模式C++
- C++程式設計實現C++程式設計
- 橋接模式(c++實現)橋接模式C++
- 折半查詢(C++實現)C++
- 字典樹及其C++實現C++
- c++ web框架實現之靜態反射實現C++Web框架反射
- 【圖形學】Loop細分演算法及半邊結構實現(C++)OOP演算法C++