《大话数据结构》最小生成树——Prim算法

/*
  2014-6-24
  思想:将点集合分为两部分,U代表已经确定的节点集合,V表示还未确定的点集合
  从U中找到节点i,从V中找到节点j,使得(i-j)边的距离为min(U-V)——类似于贪心算法。
	
  难点:确定一个节点将从V阵营叛变到U时,应该更新V阵营中节点与新集合U'(包含了叛变节点k后)的距离。
  
  理解:策反一个敌人时,则敌对阵营中和该敌人关系紧密的节点与我方的关系也“可能”改善。

*/
#include 
#include    
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

转载于:https://www.cnblogs.com/sjw1357/p/3864000.html

你可能感兴趣的:(《大话数据结构》最小生成树——Prim算法)