使用貪心算法解決最小生成樹問題。

使用貪心算法解決最小生成樹問題。

#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;
    
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章