prime算法原理:
先添加一个点,然后找没有加入的顶点中和这个点连接最小的边,加入这个点,再以这个点为基础,重复直到找到所有点
当然,虽然写着原创,实际上就是李春葆<数据结构>书上照搬的,不要抛砖哈
//prime算法模板
#define MAXV 100//后面都会用到
#define INF 32768//INF表示正无穷
struct MGraph
{
double edges[MAXV][MAXV];//邻接矩阵的边数组
int n;//顶点数,弧度;
};
MGraph g;
void Prime(MGraph g,int v)//v为起始顶点,哪个点都行
{
double lowcost[MAXV];
int closest[MAXV];//用于记录此时哪个顶点和我们已知顶点连接的边最小,如果不要求输出,可以不用这个
int i,j,k;
double min;
for(i=0;i<g.n;i++)//给lowcost[]和closest赋初值
{
lowcost[i]=g.edges[v][i];
closest[i]=v;
}
for(i=1;i<g.n;i++)//找出n-1个顶点
{
min=INF;
for(j=0;j<g.n;j++)//在V-U中找出离U最近的顶点k
if(lowcost[j]!=0 && lowcost[j]<min)
{
min=lowcost[j]; k=j;//k记录最近顶点的编号
}
sum +=min;
//cout<<k<<" "<<sum<<endl;
lowcost[k]=0;//标记k已经加入U
for(j=0;j<g.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;
}
}
}