// 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;
}
普里姆最小生成樹算法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.