Prim算法
Prim算法的核心在于选择最小两栖边,每加入一条边需要修改当前两栖边的信息。
以下程序采用邻接矩阵存储图,程序的形参是邻接矩阵(Mat[i][j])。
首先,定义最小生成树的边集的结构体,包括边的两个端点,以及边的权值。
struct EdgeTree
{
int begin,end;
int length;
};
求解最小生成树的第一步,初始化边集(两栖边),默认从第一个结点开始。Point_num为图的顶点数。
for(v=1;v<Point_num;v++)
{
Tree[v-1].begin=0;
Tree[v-1].end=v;
Tree[v-1].length=Mat[0][v];
}
选取Point_num-2条边构成最小生成树的边集。
EdgeTree x;
for(k=0;k<=PD->Point_num-2;k++)//从第k条边建立最小两栖边
{
min=Tree[k].length;
s=k;
for(j=k+1;j<=Point_num-1;j++)
{
if(Tree[j].length<min)
{
min=Tree[j].length;//记录当前最小边的权值
s=j;//记录最小边的下标
}
}
v=Tree[s].end;//v为入选结点
x=Tree[s];
Tree[s]=Tree[k];
Tree[k]=x;//通过交换,将当前最小边加入最小生成树边集
for(j=k+1;j<=Point_num-2;j++)//由于新结点的加入,修改两栖边的信息
{
d=Mat[v][Tree[j].end];
if(d<Tree[j].length&&d>0)
{
Tree[j].length=d;
Tree[j].begin=v;
}
}
}
每选择一条边,通过交换加入到Tree中;由于新加入一个结点,需要修改两栖边信息,修改方法为:新两栖边的权值如果小于之前两栖边的权值,则用新的覆盖掉旧的。循环(Point_num-2)次之后得到(Point_num-1)条边,完成求解最小生成树。