普里姆(Prim)算法是一种构造性算法。假设
G=(V,E)
是一个具有
n
个顶点的带权连通图,
1) 初始化=
2) 重复以下操作
n−1
次,使得其他
n−1
个顶点被加入到
U
中:
2.1) 从候选边中挑选权值最小的边输出,设该边在
2.2) 考察当前
V−U
中的所有顶点
vi
,修正候选边。若
(v,vi)
的权值小于原来和
vi
关联的候选边,则用
(v,vi)
取代后者作为候选边。
为了便于在集合
U
和
初始时
lowcost[i]=g.edges[v0][i]
,
在扩充顶点
v
后,若
普里姆算法如下:
void prim(MGraph g,int v)
{
int lowcost[MAXV],min,n=g.vexnum;
int closest[MAXV],i,j,k;
for (i=0;i<n;i++) //给lowcost[]和closest[]置初值
{
lowcost[i]=g.edges[v][i];
closest[i]=v;
}
for (i=1;i<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;
}
printf(" 边(%d,%d)权为:%d\n",closest[k],k,min);
lowcost[k]=0; //标记k已经加入U
for (j=0;j<n;j++) //修改数组lowcost和closest
if (g.edges[k][j]!=0 && g.edges[k][j]<lowcost[j])
{
lowcost[j]=g.edges[k][j];closest[j]=k;
}
}
}
普里姆算法的时间复杂度为 O(n2) ,适用于稠密图。