1. 程式人生 > >Prim 演算法  最小生成樹 圖

Prim 演算法  最小生成樹 圖

Prim 演算法 

#include<iostream>
#include<cstdio> 
using namespace std;
//Prinm構造最小生成樹演算法
/*
演算法採用鄰接矩陣的方法儲存 圖
以下為圖的領接矩陣表 
0 6 1 5 32767 32767
6 0 5 32767 3 32767
1 5 0 5 6 4
5 32767 5 0 32767 2
32767 3 6 32767 0 6
32767 32767  4 2 6 0
 
*/ 

#define INF 32767

#define MAXV 100
typedef struct 
{
	int edges[7][7]; 
	int n;//節點數 
	int v;//邊數 
 }MGraph;
void prim(MGraph g,int v){
	int lowcost[50];
	int closest[50];
	int min,i,j,k;
	for(i=0;i<g.n;i++){
		lowcost[i]=g.edges[v][i];
		closest[i]=v;
	}
	for(i=0;i<g.n;i++){
		min=32767;
		for(j=0;j<g.n;j++){
			if(lowcost[j]!=0&&lowcost[j]<min){
				min=lowcost[j];
				k=j;
			}
		}
		printf("邊(%d,%d)權為:%d\n",closest[k],k,min);
		lowcost[k]=0;//標記k已加入佇列U
		for(j=0;j<g.n;j++){
			if(g.edges[k][j]!=0&&g.edges[k][j]<lowcost[j])
                   lowcost[j]=g.edges[k][j];
				   closest[j]=k;			
		} 
		
		
	}
} 
int main(){
	int gn ,edx;
	cin>>gn;
	MGraph g;
	for(int i=0;i<gn;i++){
		for(int j=0;j<gn;j++){
			cin>>g.edges[i][j];
		}
	}
	g.n=6;
	g.v=10;
    prim(g,0);
	return 0;
}