加点法求最小生成树
建立两个数组closet和lowcost,用于记录V-U中顶点j到U中顶点的最小边。
对V-U中的一个顶点j,他的最小边对应U中的某个顶点用closet[j]保存,对应边权为lowcost[j]
lowcost[i]=0,i属于U,lowcost[i]不等于0,i属于V-U
void Prim(MatGraph g, int v)
{
int closet[MAXV];
int lowcost[MAXV];
int min;
int i, j, k;
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;
}
}
lowcost[k] = 0;
printf("边(%d,%d)权为%d\n", closet[k], k, min);
for (j = 0; j < g.n; j++)
{
if (lowcost[j] != 0 && lowcost[j] > g.edges[k][j])
{
lowcost[j] = g.edges[k][j];
closet[j] = k;
}
}
}
}
测试数据
7
0 28 100 100 100 10 100
28 0 16 100 100 100 14
100 16 0 12 100 100 100
100 100 12 0 22 100 18
100 100 100 22 0 25 24
10 100 100 100 25 0 100
100 14 100 18 24 100 100
原文:https://www.cnblogs.com/KIROsola/p/11920475.html