普里姆最小生成樹算法

// Prim.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
using namespace std;
const int GraphSize=10;
const int INFINITY=65535;
class MGraph
{
public:
	MGraph(){};
	~MGraph(){};
	bool CreateGraph(int **pGraph,int iSize);
	void PrimTree();
	int getVertexNum(){return m_vertexNum;}
private:
	int m_vertexs[GraphSize];
	int m_edges[GraphSize][GraphSize];
	int m_vertexNum;
};
bool MGraph::CreateGraph(int **pGraph, int iSize)
{
	if(iSize>GraphSize)
		return false;
	m_vertexNum=iSize;
	for(int i=0;i<iSize;i++)
		m_vertexs[i]=i;
	for(int j=0;j<iSize;j++)
	{
		for(int k=0;k<iSize;k++)
		{
			m_edges[j][k]=*((int*)pGraph+iSize*j+k);
		}
	}
	//輸出創建的圖
	cout<<" ";
	for(int i=0;i<iSize;i++)
		cout<<" "<<i<<" ";
	cout<<endl;
	for(int i=0;i<iSize;i++)
	{
		cout<<i<<" ";
		for(int j=0;j<iSize;j++)
		{
			cout<<m_edges[i][j]<<" ";
		}
		cout<<endl;
	}
	
	return true;
}
void MGraph::PrimTree()
{
	int adjvex[GraphSize];//保存相關連的頂點的下標
	int lowcost[GraphSize];//保存與頂點相連的權值最小的邊的權值
	int min,i,j,k;
	lowcost[0]=0;//V0作爲最小生成樹的根開始,進行遍歷
	adjvex[0]=0;
	for(i=1;i<m_vertexNum;i++)
	{
		lowcost[i]=m_edges[0][i];// 將鄰接矩陣第0行所有權值先加入數組
		adjvex[i]=0;// 初始化全部先爲V0的下標
	}
	for(i=1;i<m_vertexNum;i++)
	{
		min=INFINITY;
		k=0;
		j=1;
		while(j<m_vertexNum)
		{
			//找出lowcost中存儲的邊的最小權值
			if(lowcost[j]!=0 && lowcost[j]<min)
			{
				min=lowcost[j];
				k=j;//保存找到的最小權值的下標
			}
			j++;
		}
		//輸出權值最小的邊
		cout<<"("<<adjvex[k]<<","<<k<<")"<<endl;
		lowcost[k]=0;//將考察完的點的權值設置爲0
		//由於加入了新的點,所以需要更新lowcost數組
		for(j=1;j<m_vertexNum;j++)
		{
			if(lowcost[j]!=0 && m_edges[k][j]<lowcost[j])
			{
				//更新與頂點j相連接的最短邊的權值
				lowcost[j]=m_edges[k][j];
				//更新關聯頂點的下標
				adjvex[j]=k;
			}
		}
	}
	
}
int _tmain(int argc, _TCHAR* argv[])
{
	MGraph graph;
	int edge[9][9]={0,71,16,99,60,
			71,0,72,12,44,
			16,72,0,65,42,
			99,12,65,0,50,
			60,44,42,50,0
			};
	graph.CreateGraph((int **)edge,5);
	graph.PrimTree();
	system("pause");
	return 0;
}


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