数据结构之C++实现最小生成树普利姆(Prim)算法
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <ctime>
using namespace std;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXEDGE 20
#define MAXVEX 20
#define GRAPH_INFINITY 65535
typedef int Status;
class MGraph
{
public:
MGraph();
void CreateMGraph(void);
void MiniSpanTree_Prim(void);
void show(void);
private:
int arc[MAXVEX][MAXVEX];
int numVertexes, numEdges;
};
MGraph::MGraph()
{
numEdges=0;
numVertexes=0;
for(int i=0;i<MAXVEX;i++)
{
for(int j=0;j<MAXVEX;j++)
{
if (i==j) arc[i][j]=0;
else arc[i][j]= GRAPH_INFINITY;
}
}
}
void MGraph::show(void)
{
for(int i=0;i<numVertexes;i++)
{
cout<<endl;
for(int j=0;j<numVertexes;j++)
{
cout<<arc[i][j]<<" ";
}
}
}
void MGraph::CreateMGraph(void)
{
int i,j;
numVertexes=9;
numEdges=15;
arc[0][1]=10;
arc[0][5]=11;
arc[1][2]=18;
arc[1][8]=12;
arc[1][6]=16;
arc[2][8]=8;
arc[2][3]=22;
arc[3][8]=21;
arc[3][6]=24;
arc[3][7]=16;
arc[3][4]=20;
arc[4][7]=7;
arc[4][5]=26;
arc[5][6]=17;
arc[6][7]=19;
for(i = 0; i < numVertexes; i++)
{
for(j = i; j < numVertexes; j++)
{
arc[j][i] =arc[i][j];
}
}
}
void MGraph::MiniSpanTree_Prim(void)
{
int min, i, j, k;
int adjvex[MAXVEX];
int lowcost[MAXVEX];
lowcost[0] = 0;
adjvex[0] = 0;
for(i = 1; i < numVertexes; i++)
{
lowcost[i] = arc[0][i];
adjvex[i] = 0;
}
for(i = 1; i < numVertexes; i++)
{
min = GRAPH_INFINITY;
j = 1;k = 0;
while(j < numVertexes)
{
if(lowcost[j]!=0 && lowcost[j] < min)
{
min = lowcost[j];
k = j;
}
j++;
}
cout<<"("<<adjvex[k]<<","<<k<<")"<<endl;
lowcost[k] = 0;
for(j = 1; j < numVertexes; j++)
{
if(lowcost[j]!=0 && arc[k][j] < lowcost[j])
{
lowcost[j] = arc[k][j];
adjvex[j] = k;
}
}
}
}
int main()
{
MGraph* G=new MGraph;
G->CreateMGraph();
G->MiniSpanTree_Prim();
return 0;
}