まず、実験的な要件の対象
- アプリケーションの基本的な原則と範囲の貪欲アルゴリズムに泊まりました。
- 最小スパニングツリーの問題を解決する、貪欲アルゴリズムのプログラミングを使用してください。
第二に、実験的なコンテンツ
必要に応じて1つの貪欲アルゴリズム(プリム又はクラスカル)、最小スパニングツリーを解きます。アルゴリズムの説明と分析の複雑さ。
プログラミング、及び試験例を提供
第三に、イデオロギー的な達成するために
プリム:S、2つのセットにV、初期S {1}は、Vは、すべての頂点を含み、次いでVS jの頂点Sから最も近い頂点の距離を選択し、jがSに追加されます 二つの配列に最も近いと低コストを設定します。各Jが属するためVS、クローゼット[j]はS kの他のネイバーと比較されたSにおける点jに隣接してV [J] [クローゼット[J ] <= V [J] [K] 前記低コスト[j]は[J] [最寄り] Vの値です。ある最後の最小スパニングツリーの対応する重み値が格納されている低コスト、および各頂点のために、最も近い最小スパニングツリーは、対応するエッジに見出すことができます。
第四に、実装コード
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define mmax 100 #define maxt 100000000 int v[mmax][mmax]; void Prim(int n){ int low[mmax];// int clo[mmax]; bool s[mmax];//判断该节点是否在S中 s[1]=true; for(int i=2;i<=n;i++){ low[i]=v[1][i];//初始化 clo[i]=1; s[i]=false; } for(int i=1;i<n;i++){//对剩余的n-1个顶点进行操作 ,此处的i并无实际意思,只是起到一个记录变量的作用 int min=maxt; int j=1; for(int k=2;k<=n;k++)//从V-S中找到S中边权最小的节点 if((low[k]<min)&&(!s[k])){ min=low[k]; j=k; } cout<<j<<" "<<clo[j]<<":"<<low[j]<<endl; s[j]=true; for(int k=2;k<=n;k++){//调整low中的值,加入j节点之后,使得两个集合中的距离最小 if((v[j][k]<low[k])&&(!s[k])){ low[k]=v[j][k]; clo[k]=j; } } } } int main() { int n,m;//n vertexs and m edges cin>>n>>m; int ii,jj,tt; for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++) v[i][j]=maxt; } for(int i=0;i<m;i++){ cin>>ii>>jj>>tt; v[ii][jj]=tt; v[jj][ii]=tt; } Prim(n); return 0; } //6 10 //1 2 6 //1 4 5 //1 3 1 //2 3 5 //2 5 3 //3 4 5 //3 5 6 //3 6 4 //4 6 2 //5 6 6
最小スパニングツリー貪欲アルゴリズムを解きます
おすすめ
転載: blog.csdn.net/weixin_43442778/article/details/89604050
おすすめ
ランキング