拓扑排序DFS做法

(1) 给定一个有向图,在拓扑排序中可以有很多个正确解,由若干小段的 list 组成。

(2) 正确的单序列顺序(具体到一个list之间的元素)

(3) 正确的全序列顺序(list彼此之间的顺序,可以有多个)


e.g.,

以下图为例,不论先从哪个点开始 DFS,例如 dfs(belt)会得到一个 belt -> jacket 的 list; 但同时因为 pants -> belt,在最终的结果中,包含 pants->belt 的 list 要排在包含 belt->jacket的 list 前面。 



算法如下:

(1) DFS 得到一个符合正确拓扑顺序的 list,保证单序列顺序

(2) 每次新的list 要排在之前结果的前面,保证全序列顺序

Code:

public ArrayList<DirectedGraphNode> topSort(ArrayList<DirectedGraphNode> graph) {

ArrayList<DirectedGraphNode> res = new ArrayList<DirectedGraphNode>();

HashSet<DirectedGraphNode> visited = new HashSet<DirectedGraphNode>();

for(DirectedGraphNode root : graph){
            dfs(list, root, visited);
        }

return res;

}


private void dfs(LinkedList<DirectedGraphNode> list, DirectedGraphNode root, HashSet<DirectedGraphNode> visited){

        if(visited.contains(root)) return;
        for(DirectedGraphNode next : root.neighbors){
            dfs(list, next, visited);
        }
       
list.addFirst(root);
        visited.add(root);
    }

### 使用深度优先搜索 (DFS) 实现拓扑排序 拓扑排序是一种针对有向无环图(DAG)的操作,其目的是找到一种线性排列方式,使得对于每条从顶点 \( u \) 到 \( v \) 的有向边 \( (u, v) \),\( u \) 总是在 \( v \) 前面出现。当使用深度优先搜索(DFS)来实现拓扑排序时,可以通过记录每个节点的完成时间,并按照这些完成时间的降序排列节点来获得拓扑序列。 以下是基于 DFS拓扑排序的具体方法: #### 方法描述 1. 遍历整个图的所有节点,对尚未访问过的节点调用 DFS 函数。 2. 在每次递归返回时,将当前节点加入栈中(或者保存在一个列表里)。由于 DFS 是先深入再回溯的过程,因此最先被处理完毕的是那些没有后续依赖的任务。 3. 最终,栈中的元素顺序即为拓扑排序的结果。 这种方法的核心在于利用了 DFS 的特性——后序遍历的时间戳能够反映节点间的依赖关系[^3]。 #### Python 实现代码 下面是一个简单的 Python 示例程序展示如何通过 DFS 来执行拓扑排序: ```python from collections import defaultdict def dfs_topological_sort(graph): visited = set() stack = [] def dfs(node): if node not in visited: visited.add(node) for neighbor in graph[node]: if neighbor not in visited: dfs(neighbor) stack.append(node) # Assuming the nodes are labeled from 0 to n-1 where n is number of vertices. all_nodes = list(range(len(graph))) for node in all_nodes: if node not in visited: dfs(node) return stack[::-1] if __name__ == "__main__": g = defaultdict(list) edges = [(5, 2), (5, 0), (4, 0), (4, 1), (2, 3), (3, 1)] max_node = max(max(edges)) + 1 for src, dest in edges: g[src].append(dest) result = dfs_topological_sort(g) print("Topological Sort:", result) ``` 上述代码定义了一个函数 `dfs_topological_sort` ,它接收一个邻接表形式表示的图作为输入参数,并返回该图的一个可能的拓扑排序结果。注意这里假设节点编号是从零开始连续整数[^4]。 #### 处理特殊情况 需要注意的是,在实际应用过程中可能会遇到一些特殊情形,比如存在孤立点或者是非连通子图的情况。在这种情况下,应该分别独立地对待每一个连通分量并将其各自的拓扑排序组合起来形成最终的整体解决方案[^1]。 另外还需强调一点,只有当给定图为 DAG 时才能成功计算出它的拓扑排序;如果图中含有循环,则无法得出有效的拓扑次序。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值