拓扑排序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);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值