把一场败仗存草稿以后,开始收集一些看过的,打算做整理
先从和第一篇有联系的「贪心」「图论」「路径」「动规」算法开始
参考学习
http://blog.csdn.net/heavenboya/article/details/6654778
http://www.acmerblog.com/greedy-kruskal-spanning-tree-mst-5326.html
1.生成树Spanning Tree
「图论」图G=(V, E),包含所有顶点的极小连通子图
V个顶点,(V – 1)条边
(从不同顶点出发,走不同的分支,都可以得到不同的生成树)
此图可能是「强连通」、「有根」、「有向」、「非连通」
若“非连通”或“非强连通的有向图”,则可能只得到的「生成森林」
1)DFS生成树
优先往深处摸索,触底则回到上一节点
*「DFS」「BFS」「回溯」「剪枝pruning」
2)BFS生成树
优先遍历并保存节点的生成边,之后向深处迈步
2.最小生成树MST
最小 =「路径加权」,也称最小权重生成树
(生成树的所有边的权重总和最小)
1)Kruskal算法
a.依权重排序所有边
b.从最小的边开始加入,检测是否成环
c.重复b,直到加入了(v-1)条边
猴子也能懂:上帝视角,排序加边
O(ElogE),快排
「成环检测」
将所有点V的集合,拆为已扩展v1 { } 和未扩展v2 { }
检测边的两个顶点是否都在已扩展的v1中,若都在则成环
否则,更新两个子集和
猴子也能懂:已未拆集,此消彼长
*「并查集Union Find」「路径压缩」
ALG
2)Prim算法
a.某点出发,其相连边「候选」
b.选最小侯选边,连接新的顶点,其相连边候选
c.检测目的地相同的侯选边,比较并留下小边
d.重复b,直到加入了(v-1)条边
猴子也能懂:步步为营,优胜劣汰
*「Dijkstra算法」与Prim有些像,不断优化源点到所有点的最短路径距离,攻城拔寨
ALG
O(N^2)