背景:
无向连通图G=(V,E)的最小生成树算法:
1.prim算法:
(1)初始顶点集合S为空,把任意一个顶点s加入集合S.
(2)迭代|V|-1次,每次加入顶点u,使得v属于S,u不属于S并且(u,v)权值最小, 记录边(u,v)
(3)所有记录过的边(u,v)即最小生成树
2.kruskal算法:
(1)把有|E|中边按权值非降排序
(2)边初始集合S为空,每次加入权值最小的边,当加入后边集合不构成回路,删掉此边。回路判定可以采取并查集方法
(3)边集合为最小生成树
题意:求n个村庄的最小生成树,1<n<27,n个村庄用前n个大写字母表示。输入n和 n-1个顶点与之连通的顶点和权值。输入最小生成树边权值和。边权值小于100,边集合|E|小于等于75,一个顶点连接的边数小于等于15.
分析:prim算法对于处理稠密邻接矩阵有效,而kruskal对于边稀疏矩阵有效。这道题应该kruskal更有效一些。不过两个算法在Judge上运行都是Memory 228K, 时间为0MS,不知道那些Memory<30K是怎么优化的。
源码: