1.问题
采用prim算法和kruskal构造最小生成树。
2.解析
最小生成树是由n个顶点和n-1条边,将一个连通图连接起来,且使权值最小的结构。使用prim算法便是每次找与之连线权值最小的顶点,将该点加入最小生成树集合中。最后不允许出现闭合回路。
例如:
固定开始端点不动同时加入最小生成树集合,每次找与之连线权值最小的顶点并将该点加入集合。
2.
首先将每个顶点赋予不同的标记符号,利用快排选取其中权重最小的边,将两个顶点的标记统一,再不断选取已根据权重排序好的边,若该边两个顶点属于同一个标记符号则换边,否则不断统一顶点标记,直到所有顶点标记统一。
3.设计
设置visited辅助数组记录顶点是否被访问。
设dis辅助数组记录权值。
将visited置为0.w[][]是无向网。
从v1开始访问,pos为端点,i为另一端点的边的权值。
将dis赋予pos点的所有边的权值。
for (i = 1; i < 顶点个数; i++)
{
min = 自己设的最大值;
for (j = 1; j <= 顶点数目; j++)
{
该点是未被访问过的点且边权值小于之前min
{
min = dis[j];
下一个pos端点转移为j
}
}
for (j = 1; j <=顶点个数; j++)
如果该点未被访问且该点所对应边的权值比以遍历的顶点的边的权值大
那么就将dis数组内的权值改为以遍历的顶点的边的权值
}
2.
4.分析
prim算法的时间复杂度是NcodeNcode,空间复杂度为1.
Kruskal算法时间复杂度为arcnumvernum,空间复杂度为1.