有向图的遍历和无向图的遍历类似,主要是DFS和BFS。
对于DAG(Directed Acyclic Graph),还有一个很重要的拓扑的概念,拓扑排序的倒序可以用Depth-first search来生成,类似二叉树的后序遍历。
见Depthfirst Order in Algs4
private void dfs(Digraph G, int v) { marked[v] = true; pre[v] = preCounter++; preorder.enqueue(v); for (int w : G.adj(v)) { if (!marked[w]) { dfs(G, w); } } postorder.enqueue(v); post[v] = postCounter++; }
将postorder反转后就是有向无环图的拓扑排序。拓扑排序的其中一个现实应用场景就是当有多个任务可同时进行并且任务之间有先置关系是的调度决策。
编程练习
WordNet
这个project虽然定义中有一个shortest ancestor,但他不是一棵树,而且边的指向是从儿子->父亲,我用的方法是分为两个输入节点各自做一次DFS,并且记下每个节点到起始节点的距离,得到两个数组depthA,deptahB,分别代表每个节点到A和B的距离,然后就是找到min(depthA[i] +deptahB[i]) (0<=i<n) 即可。
时间: 2024-11-03 01:33:50