最小生成树——普利姆算法(prim)

时间:2022-10-08 11:39:04

最小生成树——普利姆算法(prim)

这是摘抄自《大话数据结构》中的一句话,其实我是没看懂,但是看了代码,加上百度了之后,普利姆算法的步骤:
1、先假设之后一个节点,并同时把这些顶点的权值放在一个数组里,还有创建一个数组保存最小权值顶点的下标,找到这个节点边上的最小权值,这边的另一个节点为K
2、从节点K开始,再次寻找,把与k有关的权值放在一个数组里,若是比数组的值小就修改,同时修改下标的值,否则不改
3、重复2的步骤

好吧,我也不知道自己在说啥,直接上代码

#include<stdio.h>

#define MAX 100
#define INFINITY 65535

typedef struct
{
int vestex[MAX];
int ves;
int edge;
int e[MAX][MAX];
}MGraph;

void createMGraph(MGraph* G)
{
int i;
int j;
int w;
int start;
int end;

printf("please input the vesnum and egdenum:\n");
scanf("%d%d",&G->ves,&G->edge);

printf("please input the ves:\n");
for(i = 0; i < G->ves; i++)
{
scanf("%d",&G->vestex[i]);
}
// 初始化
for(i = 0; i < G->ves; i++)
{
for(j = 0; j < G->ves; j++)
{
G->e[i][j] = INFINITY;
}
}

printf("please input(vi,vj):\n");
for(i = 0; i < G->edge; i++)
{
scanf("%d%d%d",&start,&end,&w);
G->e[start][end] = w;
G->e[end][start] = G->e[start][end];//无向图,矩阵对称
}

}


void MiniSpanTree_prim(MGraph G)
{
int min;
int i;
int j;
int k;

int lowcast[MAX];//保存权值
int adjvex[MAX];//保存顶点下标

lowcast[0] = 0;//初始化第一个权值,即v0加入了生成树
adjvex[0] = 0;
for(i = 1; i < G.ves; i++)
{
lowcast[i] = G.e[0][i];//与v0顶点之间有权值的存入数组
adjvex[i] = 0;//将顶点初始化为0
}

for(i = 1; i < G.ves; i++)
{
min = INFINITY;
j = 1; k = 0;
while(j < G.ves)
{
if(lowcast[j] != 0 && lowcast[j]<min)
{
min = lowcast[j];//找与顶点0相关的最小的权值
k = j;//权值最小的下标
}

j++;
}
printf("(%d,%d)",adjvex[k],k);//打印当前顶点中权值最小的边
lowcast[k] = 0;
for(j = 1; j < G.ves; j++)
{
if(lowcast[j] != 0 && G.e[k][j] < lowcast[j])
{
lowcast[j] = G.e[k][j];
adjvex[j] = k;
}

}
}
}
void display(MGraph G)
{
int i;
int j;

for(i = 0; i < G.ves; i++)
{
for(j = 0; j < G.ves; j++)
{
printf("%4d ",G.e[i][j]);
}
printf("\n");
}
}
int main()

{
MGraph G;
createMGraph(&G);
// display(G);

MiniSpanTree_prim(G);
}

结果:
最小生成树——普利姆算法(prim)