最小生成树
1 最小生成树的概念
生成树: 极小连通子图(边数最少,且删除任意一条边不再连通)
最下生成树:生成树的权值之和是最小的
2 Prim算法
2.1 原理
算法思想:任意一个顶点开始放入集合U,
每次选测一个与U中顶点最近的一个顶点,比你高将两个顶点之间的边极爱入到树中
重复,直到所有顶点都加入到生成树顶点集合U中为止
2.2 算法实现:
//记录U中点到个点最近边的信息(边的信息包括顶点和边的权值)
struct {
VertexType adjvex;
VRTtype lowcost;
}closedge[MVNUM];
void MiniSpanTree_P(MGraph G, VertexType u)
{
//u在图中的位置, u是结点信息
k = LocateVex(G, u);
for (j = 0; j < G.vexnum; j++)
if (j != k)
{
closedge[j].adjvex = u;
closedge[j].lowcost = G.arcs[k][j];
}
//用lowcost = 0 来表示 结点已经加入到生成树节点集合U中
closedge[k].lowcost = 0;
for (int i = 1; i <= G.vexnum - 1; i++)
{
//求最小的边 对应的 未加入集合的结点
k = mininum(closedge);
print(closedge[k].adjvex, G.vexs[k]);
closedge[k].lowcost = 0;
for (int j = 0; j < G.vexnum; j++)
{
if (G.arcs[k][j].adj <closedge[j].lowcost)
{
closedge[j].adjvex = G.vexs[k];
closedge[j].lowcost = G.arcs[k][j].adj;
}
}
}
}
3 Kruskal算法
算法思想: 每次选择一条最短边,只要不构成回路,即添加到最小生成树中
直到 n-1 条边选择完毕
4 总结与推广