使用貪心算法解決最小生成樹問題。
#include<iostream>
#include<algorithm>
using namespace std;
const int MAX=100;
const int MAX_length=10000;
int n,m;
int G[MAX][MAX];//相鄰兩邊的長
int d[MAX];
bool V[MAX]={false};
int prim(){
int sum=0;
V[1]=true;
d[1]=0;
for(int i=1; i<=n; i++)d[i]=G[1][i];
for(int i=1;i<n;i++){//n-1條邊
int index=0,MIN=MAX_length;
for(int j=1;j<=n;j++){//每次從頭開始搜索最短路徑
if(V[j]==false && d[j]<MIN){//MIN不斷改變求出當前最小值
index=j;
MIN=d[j];
}
}
V[index]=true;//true表示該點已被用
sum+=MIN;
for(int v=1;v<=n;v++){
if(V[v]==false && G[index][v]<d[v]){
d[v]=G[index][v];//進行更新 ,如果剛剛更新的點連接的邊更短,用更短的邊 替換原來的邊
}
}
}
return sum;
}
int main()
{
int u,v,w;
cout<<"輸入個數和邊數:";
cin>>n>>m;
fill(G[0],G[0]+MAX*MAX,MAX_length);//把所有空間的值置爲MAX
cout<<"輸入兩個點和邊長:"<<endl;
for(int i=1;i<=m;i++){//把每條邊長輸入數組 ,有邊則覆蓋之前的MAX
cin>>u>>v>>w;
G[u][v]=G[v][u]=w;
}
int sum=prim();
cout<<"貪心求最小生成樹值爲:"sum;
}