图的最小生成树构造算法:普里姆算法(Prim)
#define MAXV <最大顶点个数>
typedef struct
{
int no;//顶点编号
InfoType info;//顶点其他信息
}VertexType;//顶点类型
typedef struct
{
int edges[MAXV][MAXV];//邻接矩阵的边数组
int n,e;//顶点数,边数
VertexType vexs[MAXV];//存放顶点信息
}MGraph;//完整的图邻接矩阵类型
#define INF 32767
void Prim(MGraph g,int v)
{
int lowcost[MAXV];//存放边的权值
int min;
int closest[MAXV],i,j,k;//closest数组:存放顶点编号
for(i=0;i<g.n;i++)
{
lowcost[i]=g.edges[v][i];
closest[i]=v;
}
for(i=1;i<g.n;i++)//找出(n-1)个顶点
{
min=INF;
for(j=0;j<n;j++)//在(V-U)中找出离U最近的顶点k
if(lowcost[j]!=0 && lowcost[j]<min)
{
min=lowcost[j];
k=j; //k记录最近顶点的编号
}
printf("边(%d,%d)权为:%d\n",closest[k],k,min);
lowcost[k]=0; //标记k已经加入U
for(j=0;j<g.n;j++)//修改数组lowcost和closest
if(g.edge[k][j]!=0 && g.edge[k][j]<lowcost[j])
{
lowcost[j]=g.edges[k][j];
closest[j]=k;
}
}
}