图论 Graph Theory[union find]

做开发几乎就没怎么用图论,有一点忘了。。复习一下


MST: 每一个Node是connected, Total Weight最小化, 没有cycle。

Krusal's Minimum Spanning Tree:

使用Greedy Approach. 每次选择利益最大化的。 每次add lightest edge that doesn't produce cycle.


Union Find:

对问题建模:

在对问题进行建模的时候,我们应该尽量想清楚需要解决的问题是什么。因为模型中选择的数据结构和算法显然会根据问题的不同而不同,就动态连通性这个场景而言,我们需要解决的问题可能是:

给出两个节点,判断它们是否连通,如果连通,不需要给出具体的路径

给出两个节点,判断它们是否连通,如果连通,需要给出具体的路径

就上面两种问题而言,虽然只有是否能够给出具体路径的区别,但是这个区别导致了选择算法的不同,本文主要介绍的是第一种情况,即不需要给出具体路径的Union-Find算法,而第二种情况可以使用基于DFS的算法。

to add new sets, to merge existing sets, and to determine whether elements are in the same set

Disjoint-set data structures model the partitioning of a set, for example to keep track of the connected components of an undirected graph. This model can then be used to determine whether two vertices belong to the same component, or whether adding an edge between them would result in a cycle. The Union–Find algorithm is used in high-performance implementations of unification.[11]


图论 Graph Theory[union find]_第1张图片

Find() 就是trace up找到是属于哪个set的。

图论 Graph Theory[union find]_第2张图片

Strongly Connected Components: 

是相对于Directed Graph来说的,就算当node u, v 互相有一条path通往对方。这两个node together叫做strongly connected. 如果一个node跟其他与世隔绝,它自己也是一个strongly connected component.

用DFS可以Linear Time找出Strongly Connected Components.


Dijkstra Algorithm:

求minimum path in graph. 比如从A出发到X点的最短路径。算法上很像BFS,但是速度慢了一点,因为Dijkstra用了Priority Queue, 影响了速度。

Intuition: 

由于Dijkstra算法的性质, 从起点到下一个点V的cost一定从起点到之前的点U的cost长。【因为U是在V之前访问的点, 所以U一定是一个cost比较短的,否则我们会先去V 】所以就算之后v接回u,也不会导致u的distance from s再变动。【因为node cost变化降低的条件是从另一个点去那里比原本已知的cost还能更低。 但是V已经cost比U大了,再去U只会cost更大】。但是有negative path的话,就有可能下一个点连回去会导致之前那个点变化。

对于有negative path的graph, Dijkstra不行。 

Bellman-Ford Algorithm:

你可能感兴趣的:(图论 Graph Theory[union find])