图算法之最小生成树
将给出的所有点连接起来(即从一个点可到任意一个点)且连接路径之和最小的图叫最小生成树。要解决最小生成树问题,通常采用两种算法:Prim算法和Kruskal算法。
一般来说,prim算法适合稠密图,kruskal算法适合稀疏图。
Prim算法
Prim算法构建最小生成树的过程是:先构建一棵只包含顶点V1的树A,然后每次在连接树A顶点和图G中树A以外的顶点的所有边中,选取一条权重最小的边加入树A,直至树A覆盖图G中的所有顶点。
1 | def MiniSpanTree_prim(nodes, graph): |
Kruskal算法
Kruskal算法构建最小生成树的过程是:令树T的初始状态为|V|个结点而无边的非连通图,树T中的每个顶点自成一个连通分量。接着,每次从图G中所有两个端点落在不同连通分量的边中,选取权重最小的那条,将该边加入树T中,如此往复,直至树T中所有顶点都在同一个连通分量上。
1 | def MiniSpanTree_kruskal(nodes, graph): |
破圈法
这种方法最早是管梅谷教授在1974年提出来的,这种方法很巧妙,也很好玩,就是这个连通图肯定是连通的嘛,那环肯定是有的,那我就把你的环给破坏了,而且挑权重最大的那条边来破坏,不停地破下去,直到所有的顶点都处于同一个连通分量上,并且边数为n-1条。