Graph
题型
- 无向图找两点间的path:无向图搜索就是DFS/BFS + visited set
- 有向图找两点间的path:如果有向图可能有环,我们也一样需要使用visited set,只不过这里我们不care edge只care node,所以visited set应该记录的是node信息。
- check有向图是否有环:这道题我们可以使用三种方法
- 拓扑排序:只有最后形成的path包含了每一个node,才是没有环
- DFS/BFS:这里我们用一个globally visited set来记录我们已经遍历过的node,然后一个temp visited set来记录当下recursion stack里visited过的,重复就说明有环。
- 3-color painting。还是使用DFS/BFS,只不过开始都是白色,当下recursion的时候涂成灰色,如果遇到了灰色again,那么说明有环。如果没有遇到,再遍历一遍全部涂成黑色。
- check无向图是否有环:这里我们有两种办法
- union-find:使用union-find我们可以check到每一条edge的情况。这样只要两个node在union之前已经连上了,则说明有环
- DFS/BFS:和有向图不同的是,如果只有两个node相连,那么他们是不叫环的。但是我们使用BFS/DFS的时候,在a->b之后,又会check b->a,所以我们要记录parent.只有当neighbor已经visited过并且还不是parent,说明我们找到了环。
题目
有向图是否有环
无向图是否有环
无向图是否有环 无向图找两点间path
- Lintcode 531. Six Degrees
有向图找两点间path
- Lintcode 176. Route Between Two Nodes in Graph
无向图遍历
- Leetcode 133. Clone Graph (无向图DFS + HashMap)