【发布时间】:2014-08-23 10:52:52
【问题描述】:
考虑到以下代表循环图的文件,我正在寻找一个 shell 脚本来查找从图中的任何节点开始的所有可到达节点?
A.txt(每行的第一个元素是节点,其余是从它可以到达的相邻节点):
a3 a4
a2 a4 a5
a4 a5
a5 a6
a6 a7
a7 a8
a8 a9
a9
所需的输出文件(B.txt 和 C.txt)必须是 DFS 或 BFS 的输出,并且包括从任何开始节点到其可到达节点的深度(距离)。比如:
B.txt
a3 a4 a5 a6 a7 a8 a9
a2 a4 a5 a6 a7 a8 a9
a4 a5 a6 a7 a8 a9
a5 a6 a7 a8 a9
a6 a7 a8 a9
a7 a8 a9
a8 a9
a9
C.txt
0 1 2 3 4 5 6
0 1 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4
0 1 2 3
0 1 2
0 1
0
Awk 是首选,尽管任何类型的 shell 脚本都可以。
【问题讨论】:
-
这里有些不清楚。根据您的可达性输出,很明显该图是有向的:a8 到达 a9,但 a9 没有到达 a8。其次,由于某种原因,每个节点都会到达自己。第三,这是示例图是“循环”的唯一意义。在其他方面它是非循环的:每个顶点 An 只有与 m > n 相邻的更高编号的顶点 Am。没有反向引用(除了隐式从 An 到 An)。
-
Perl 解决方案假定图是非循环的,并且对于任何 m > n,节点 Am 可以从 An 到达,而其他节点不可到达。因此,节点可以排列成一个序列,我们只需要提取该序列的后缀。这不是从图中的任意点(即使在 DAG 中)开始的适当的深度优先搜索。考虑像 (a1 a2) (a1 a3) (a3 a4) (a3 a5) (a2 a6) (a2 a7) 这样的图:平衡二叉树。从节点 a3 开始,我们只到达 a4 和 a5。从 a2,我们只到达 a6 和 a7:节点的不同子集,它们不是公共序列的后缀。
标签: shell awk graph-theory text-processing