免責事項:この記事はブロガーのオリジナルの記事、再現され、添付してください明ソース^ _ ^ https://blog.csdn.net/cprimesplus/article/details/90214800
最小スパニングツリーの概念
仮定すると 、都市間の道路を中国聯通の 唯一の都市 道路ストリップが。目的は、最適なソリューションを求めて、最小の支出合計の道を作ることです。
MST自然
MST(ほとんどのスパニングツリー)自然、すなわち:
最小スパニングツリーの性質:G =(V、E)は、通信ネットワークであり、Uは、頂点Vの集合の空でない部分集合でありう (u、v)はGがエンドポイントに「U(例えば:u∈U)であり、エッジのもう一方の端は(例えば:v∈VU)Uではない場合、および(U、V)の最小量を有します、次にGの最小スパニングツリーは、このエッジ(U、V)が挙げられるがあります。
方言すなわち説明:
部分集合からのセットを構成するすべてのノードのユニコムネットワーク、いずれかのUは、Vが構成されていると呼ばれるセットの小さな部分集合を減算することにより設定と呼ぶ取ります。uからvへのパスの最低重量を見つけ、このパスは、最小スパニングツリーUnicom社のネットワークに属している必要があります。
MSTプルーフ特性と理解
背理法、「データ構造」P173のヤン魏分バージョンを参照してください。
アルゴリズムのプリムほとんど理解:
なぜ、この構造は、ツリー(ノーリング)で構成されていますか?プリム思考は、ステップのアルゴリズムによって発見することができます:
(1)場合に環を形成することができない経路を構成する新たなノードを追加Uだけつの要素点の最初のセット。
リングノードに新しいノードをUに置かれていると(2)3以上のノードuは、次にパスがリングに追加しにくい場合には、前のように構成してもよいです。
プリム最小スパニングツリーアルゴリズムコード
// Prime算法求图的最小生成树
#include<iostream>
#include<cstring>
#define MAX_SIZE 128
#define INF 0x3f3f3f3f
using namespace std;
int Graph[MAX_SIZE][MAX_SIZE], vexnum;
int MSTByPrim()
{
int vis[MAX_SIZE]; // 辅助数组,用来记录一个点是否已经被加入到割集U,不加这个辅助数组的话还需要再遍历U 判断一个点是否在U 中
int U[MAX_SIZE];
memset(vis, 0 ,sizeof(vis));
vis[0] = 1; // 最初放入顶点A
U[0] = 0;
int res = 0;
int index = 1;
while(index < vexnum)
{
int min_val = INF, temp = 0, markU = 0;
for(int i = 0;i < index;i++){
for(int j = 0;j < vexnum;j++){
if(!vis[j] && Graph[U[i]][j]<min_val){
min_val = Graph[U[i]][j];
markU = U[i];
temp = j;
}
}
}
cout<<(char)(markU+'A')<<"-->"<<(char)(temp+'A')<<' '<<min_val<<endl;
vis[temp] = 1;
res += min_val;
U[index++] = temp;
}
return res;
}
int main()
{
cin>>vexnum;
for(int i = 0;i < vexnum;i++)
for(int j = 0;j < vexnum;j++){
cin>>Graph[i][j];
if(!Graph[i][j]) Graph[i][j] = INF;
}
cout<<MSTByPrim();
return 0;
}
テストケースと結果