在图中,寻找一棵最小代价的生成树尤为重要。现在有普里姆算法。基于邻接矩阵来实现。
void Prim(MGraph g,int v0,int &sum){
int lowcost[maxsize],vset[maxsize],v;
int k;
int min;
int v=v0;
for(i=0;i<g.n;i++){///此为初始情况,将v0相接的顶点权值读入lowcost数组中
vset[i]=0;
lowcost[i]=g.edges[v0][i];
}
for(int =0;i<g.n;i++){
min =INF;
for(int j=0;j<g.n;j++){
if(vset[j]==0&&lowset[j]<min){在lowcost数组中寻找到最小值,作为最小值
min=lowcost[j];
k=j;
}
v=k;
vset[v]=1;//将最小值的结点接入当前的树中
for(int i=0;i<g.n;i++){//将lowcost数组进行更新
if(vset[i]==0&&e.dges[v][i]<lowcout[i])
lowcost[i]=e.dges[v][i];//此句是实现了更新
}
}
}
}
代码大致思路解析:首先要明白此代码是有三个遍历,并且后两个遍历是嵌套与第一个遍历中。为了说明,将后两个遍历命名为a,b;
a是为了找出当前lowcost数组中的最小值,后续并将其接入当前的树中,而b在接入一个新的顶点后,将lowcost数组进行更新与拓展。最后在回到第一个大循环中,大循环执行了n次,正好相当于对每个结点进行一次。最后生成的树自然是最小代价树,属于贪心算法的一种。