/*
2014-6-24
思想:将点集合分为两部分,U代表已经确定的节点集合,V表示还未确定的点集合
从U中找到节点i,从V中找到节点j,使得(i-j)边的距离为min(U-V)——类似于贪心算法。
难点:确定一个节点将从V阵营叛变到U时,应该更新V阵营中节点与新集合U'(包含了叛变节点k后)的距离。
理解:策反一个敌人时,则敌对阵营中和该敌人关系紧密的节点与我方的关系也“可能”改善。
*/
#include <iostream>
#include <queue>
using namespace std;
typedef char VertexType; /* 顶点类型应由用户定义 */
typedef int EdgeType; /* 边上的权值类型应由用户定义 */
#define MAXSIZE 9 /* 存储空间初始分配量 */
#define MAXEDGE 15
#define MAXVEX 9
#define INFINITY 65535
typedef struct
{
VertexType vexs[MAXVEX]; /* 顶点表 */
EdgeType arc[MAXVEX][MAXVEX];/* 邻接矩阵,可看作边表 */
int numVertexes, numEdges; /* 图中当前的顶点数和边数 */
}MGraph;
/* ****************************************************** */
void CreateMGraph(MGraph *G)
{
int i, j;
G->numEdges=15;
G->numVertexes=9;
/* 读入顶点信息,建立顶点表 */
G->vexs[0]='A';
G->vexs[1]='B';
G->vexs[2]='C';
G->vexs[3]='D';
G->vexs[4]='E';
G->vexs[5]='F';
G->vexs[6]='G';
G->vexs[7]='H';
G->vexs[8]='I';
for (i = 0; i < G->numVertexes; i++)/* 初始化图 */
{
for ( j = 0; j < G->numVertexes; j++)
{
G->arc[i][j]=INFINITY;
}
}
G->arc[0][1]=10;
G->arc[0][5]=11;
G->arc[1][2]=18;
G->arc[1][8]=12;
G->arc[1][6]=16;
G->arc[2][3]=22;
G->arc[2][8]=8;
G->arc[3][4]=20;
G->arc[3][7]=16;
G->arc[3][6]=24;
G->arc[3][8]=21;
G->arc[4][5]=26;
G->arc[4][7]=7;
G->arc[5][6]=17;
G->arc[6][7]=19;
for(i = 0; i < G->numVertexes; i++)
{
for(j = i+1; j < G->numVertexes; j++)
{
G->arc[j][i] =G->arc[i][j];
}
}
}
int visited[MAXVEX]; /* 访问标志的数组 */
void Prim(MGraph G)
{
int min,i,j,k;
int adjvex[MAXVEX];
int lowcost[MAXVEX];
lowcost[0]=0;/*值为0表示此下表的定点已经加入生成树*/
adjvex[0]=0;/*初始化第一个定点下表为0*/
for(i=1;i<G.numVertexes;++i)
{
lowcost[i]=G.arc[0][i];/* 将v0顶点与之有边的权值存入数组*/
adjvex[i]=0;/* 初始化为V0的下表 */
}
for(i=1;i<G.numVertexes;++i){
min=INFINITY;
j=1;k=0;
while(j<G.numVertexes){
if(lowcost[j]!=0 && lowcost[j]<min){
min=lowcost[j];
k=j;
}
++j;
}
printf("(%d,%d)",adjvex[k],k);
lowcost[k]=0;
for(j=1;j<G.numVertexes;++j){/* 节点k成功加入生成树了,需要更新其余节点到节点集合u的距离,是更新*/
if( lowcost[j]!=0 && G.arc[k][j]<lowcost[j] )
{
lowcost[j]=G.arc[k][j];
adjvex[j]=k;
}
}
}
}
int main(void)
{
MGraph G;
CreateMGraph(&G);
Prim(G);
cout<<endl;
return 0;
}