Topological Sort

Directed 拓扑排序:
  1. DFS 思路:任意起始 dfs向深找,找到最深一个元素,标为N(或放入stack),backwards标记N -1, N-2..(或放入stack),直到某个结点有别的路先不标这个点 先走别的路到底往回 继续标(或放入stack)。过程记录global visited,global visited的说明已经dfs过了不用处理,其实还应该keep一个on_path的visited,就是一次dfs到底过程中的on_path visited,如果碰到on_path visited 说明有loop不能够完成Topological Sort。on_path visited的更新类似回溯,到底后回溯回来一步要将该结点的on_path visited再改为false.

参考: https://www.youtube.com/watch?v=n_yl2a6n7nM

  1. BFS 思路:从indegree==0的地方bfs向内部找,找到将该node剪掉(其置为visited或将其indegree无效 并 更新其neighbors的indegree--),然后继续从indegree==0的地方找。
    实现时,每次可将indegree==0的那些点放到queue中,持续处理。(queue也可以该成stack, 但整体思路是BFS的,内部小部分dfs/bfs都可以)

(不用queue起始也可以的,hashmap记录indegree==0的标号,或是每次再搜索别的indegree==0的结点,整体思路是BFS的)
参考: https://www.youtube.com/watch?time_continue=259&v=71eHuQvSwc0

Example:

  1. Course Schedule http://www.jianshu.com/p/8665248b4458
  2. Course Schedule II http://www.jianshu.com/p/96841bf6f167
    332 Reconstruct Itinerary http://www.jianshu.com/p/443d7133a7ad
UnDirected 拓扑排序:

Indegree的定义方式和Directed有区别,edge双方相互都+"indegree"。
此外,
(1) 在做UnDirected 拓扑排序时,要避免访问前驱:
实现1:采用在adj_list.get(cur).remove(prev)的方式,因为(1),所以remove是O(1), 且这样就不需要使用indegree数组,adj_list.get(cur).size()就可以作为indegree作用。
(实现2: 不remove,通过visited数组,但额外需要indegree数组,因为adj_list.get(cur).size()不能再作为indegree作用。可以indegree数组/visited数组通过共同一个数组表示。)因为下述(2),肯定是访问到的是 prev->cur->next形式,所以remove是O(1),实现1比较好

(2) 在做UnDirected 拓扑排序时,访问到的indegree = 1的node,最多肯定只有一个前驱和一个后继,所以不需要遍历list来拿到nexts,只有一个next,直接可以通过adj.get(u).iterator().next();

310题 Minimum Height Trees http://www.jianshu.com/p/b0ff2e41d94d
269题 Alien Dictionary

  1. Sequence Reconstruction

你可能感兴趣的:(Topological Sort)