普利姆算法把顶点分为两个集,一个放当前位置最小生成树上的结点U,一个放尚未处理过的结点V-U,这两个集合的各个结点之间肯定存在着一些边,我们选择权值最小的边,作为最小生成树的边,然后调整两个集合的结点,我们一旦选择了一条边作为最小生成树的边,那么这条边对应的节点,就要放进U里了。以此类推,直到U包含了所有结点。
//普利姆算法
#define MAXV 255
#define ElemType char
typedef struct {
int no; //顶点编号
ElemType info;//顶点其他信息
}VertxType; //顶点类型
typedef struct
{
int edges[MAXV][MAXV];//邻接矩阵数组
int n, e; //顶点数和边数
VertxType vexs[MAXV];//存放顶点信息
}MGraph;//邻接矩阵的类型
#define INF 0x3f3f3f3f
void prim(MGraph g, int v)
{
int closet[MAXV];
int lowcost[MAXV];
int i, j, k,min;
for (i = 0; i < g.n; i++)
{
lowcost[i] = g.edges[v][i];
closet[i] = v;
}
for (i = 1; i < g.n; i++)
{
min = INF;
for (j = 0; j < g.n; j++)
{
if (lowcost[j] != 0 && lowcost[j] < min)
{
min = lowcost[j];
k = j;
}
printf("(%d,%d),%d", closet[k], k,min);
lowcost[k] = 0;
for (j = 0; j < g.n; j++)
{
if (g.edges[k][j] != 0 && g.edges[k][j] < lowcost[j])
{
lowcost[j] = g.edges[k][j];
closet[j ]= k;
//在closet数组里,通过j我们可以找到k,通过k我们可以找到与他相邻接的上一个结点
}
}
}
}
}