一个连通图的生成树是一个极小的连通子图,它包含图中全部的顶点(n个顶点),但只有n-1条边。
最小生成树:构造连通网的最小代价(最小权值)生成树。
P算法的核心思想是将连通图分为两部分,一部分part1是我正在构造的部分,一部分part2是用来选择顶点和边(变为part1-part2最短的边)加入到part1,最终使得part1包含全部顶点以及n-1条边。
步棸:
对于图G{V,{E}}则
1.使Vnew={u0}(u0任取一顶点),Enew={};
2.在集合E中选取权值最小的边<u,v>(u∈Vnew,v∈V-Vnew);
3.将v加入到集合Vnew,<u,v>加入集合Enew;
4.重复步棸2,直到Vnew包含连通图全部顶点;
5.输出Vnew和Enew为连通图最小生成树;
//prim算法生成最小生成树
void MiniSpanTree_prim(MGraph G)
{
int min=0, i=0, j=0, k=0;
int adjvex[1024] = { 0 };/*保存相关下标*/
int lowcost[1024] = { 0 };/*保存相关顶点边间的权值*/
lowcost[0] = 0; /*初始化第一个权值为0,即v0加入生成树*/
/*lowcost的值为0,在这里就是此下标的顶点已经加入生成树*/
adjvex[0] = 0;/*初始化第一个顶点下标为0*/
for (i = 1; i < G.numVertexes; i++)
{
lowcost[i] = G.arc[0][i];/*将v0顶点与之有关的边的权值存入数组*/
adjvex[i] = 0;
}
for (i = 1; i < G.numVertexes; i++)
{
min = 65535;/*初始化最小权值为无穷*/
j = 1; k = 0;
while (j < G.numVertexes)
{
/*如果权值不为0且权值小于min*/
if (lowcost[j] != 0 && lowcost[j] < min)
{
min = lowcost[j];
k = j;
}
j++;
}
cout << adjvex[k] << ","<<k << " ";
lowcost[k] = 0;/*将当前权值设置为0,表示该顶点已经完成了任务*/
for (j = 1; j < G.numVertexes; j++) /*循环所有顶点*/
{
if (lowcost[j] != 0 && G.arc[k][j] < lowcost[j])
{
lowcost[j] = G.arc[k][j];
adjvex[j] = k;
}
}
}
}