最小生成树之Prim算法的学习心得与个人总结
最小生成树:MST
从4.24到今天5.4(除去29,30,1三天假期),完成了hdu1162 , hdu1102 , hdu3371 , hdu1233 , hdu1879 , hdu1301 , hdu1864 。由于我的入手学习方法错了,导致花的时间比较长,效率低。错误方法是看完白书和黑书直接做模板题,导致了对算法细节的理解一塌糊涂。建议应该先看各种博文,理解模板每一步的意义,再做题。此处感谢TZL对我及时的批评和建议,受用无穷。
现在谈一下最小生成树之Prim算法。这个算法是对图中的点进行贪心,从起始点开始,到图中个点的边权值最小的纳入最小生成树集合中的过程。算法中涉及到了一个二维数组和两个一维数组,其中这两个一维数组意义重大,曾一度搞得我把算法改的一塌糊涂。
二维数组map[ a ][ b ] :存储从点a到点b的边的权值。
一维数组low[ i ] :存储记录顶点集合T'中各顶点距离到顶点集合T中最小的边的权值。这时,从起始点与for循环中到达的点i一起进行贪心,与起始点和i点相连的路径中权值最小将存进low[i]。我一开始理解成当前点所连接的边的最小权值。这是不全面的。
一维数组v[i] :记录顶点集合T'中各顶点距离到顶点集合T中哪个顶点距离最近。类型可以选择int 或者bool 。对应的值时0,1 或者true,false 。当v[i] = 1 / true 时,表示点i属于集合T 。
根据个人习惯或者题目要求,一般选择从点1或者点0开始贪心。这时对应的边界值,初始化都是不同的。一定要上下对应!
Prim模板:(从点1开始贪心)
以 Hdu1863 - 通畅工程 为例题,这是一道MST的裸题。
题意:n为路的数目,m为村庄数;若无法连通