< adj[i].size(); ++j) {int k = adj[i].get(j);inDegree[k]--;if (inDegree[k] == 0) queue.add(k);}}}
DFS算法
图上的深度优先搜索我们前面已经讲过了,实际上,拓扑排序也可以用深度优先搜索来实现 。不过这里的名字要稍微改下,更加确切的说法应该是深度优先遍历,遍历图中的所有顶点,而非只是搜索一个顶点到另一个顶点的路径 。
具体的代码如下:
public void topoSortByDFS() {// 先构建逆邻接表,边s->t表示,s依赖于t,t先于sLinkedList
第一部分是通过邻接表构造逆邻接表 。邻接表中,边 s->t 表示 s 先于 t 执行,也就是 t 要依赖 s 。在逆邻接表中,边 s->t 表示 s 依赖于 t,s 后于 t 执行 。为什么这么转化呢?这个跟我们这个算法的实现思想有关 。
第二部分是这个算法的核心,也就是递归处理每个顶点 。对于顶点来说,我们先输出它可达的所有顶点,也就是说,先把它依赖的所有的顶点输出了,然后再输出自己 。
总结:
拓扑排序应用非常广泛,解决的问题的模型也非常一致 。凡是需要通过局部顺序来推导全局顺序的,一般都能用拓扑排序来解决 。除此之外,拓扑排序还能检测图中环的存在 。对于 Kahn 算法来说,如果最后输出出来的顶点个数,少于图中顶点个数,图中还有入度不是 0 的顶点,那就说明,图中存在环 。
【算法之拓扑关系】参考资料
- 著名才女薛素素和顺秀玉之间到底发生了什么
- 诸葛亮和司马懿谁更厉害?卤城之战说明一切
- 秦桧之子墓被发掘陪葬的竟是忠臣良将的女儿
- 一夜就人间蒸发!揭秘古代夜郎国失踪之谜
- [GIS算法] 拓扑关系
- 像素与分辨率之间的关系
- 精灵存在之谜:大自然中是否真有精灵存在
- 揭:三国演义夷陵之战的虚构情节
- 揭秘李世民凭借什么而开创了贞观之治呢?
- 鱼鳍和人类手指竟然有如此多的相同之处