普里姆算法的普里姆算法的实现

2025-05-05 02:32:55
推荐回答(1个)
回答1:

为了便于在两个顶点集U和V-U之间选择权最小的边,建立了两个辅助数组closest和lowcost,它们记录从U到V-U具有最小权值的边,对于某个j∈V-U,closest[j]存储该边依附的在U中的顶点编号,lowcost[j]存储该边的权值。
为了方便,假设图G采用邻接矩阵g存储,对应的Prim(g,v)算法如下:
void Prim(MatGraph g,int v) //输出求得的最小生树的所有边
{ int lowcost[MAXVEX]; //建立数组lowcost
int closest[MAXVEX]; //建立数组closest
int min,i,j,k;
for (i=0;i{ lowcost[i]=g.edges[v][i];
closest[i]=v;
}
for (i=1;i{ min=INF; k=-1;
for (j=0;jif (lowcost[j]!=0 && lowcost[j]{ min=lowcost[j];
k=j; //k为最近顶点的编号
}
printf( 边(%d,%d),权值为%d\n,closest[k],k,min);
lowcost[k]=0; //标记k已经加入U
for (j=0;jif (g.edges[k][j]!=0 && g.edges[k][j]{  lowcost[j]=g.edges[k][j];
closest[j]=k;
}
}
}
普里姆算法中有两重for循环,所以时间复杂度为O(n2),其中n为图的顶点个数。由于与e无关,所以普里姆算法特别适合于稠密图求最小生成树。