From c48fa3789edac680589cfe329944ab422af29792 Mon Sep 17 00:00:00 2001 From: shellfly Date: Sun, 6 May 2018 22:41:05 +0800 Subject: [PATCH] add DirectedDFS --- README.md | 1 + algs4/depth_first_search.py | 1 - algs4/directed_dfs.py | 56 +++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 algs4/directed_dfs.py diff --git a/README.md b/README.md index 723687f..915e446 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,7 @@ Try to keep the interface and variable name consistent with the original book wh * [SymbolGraph](algs4/symbol_graph.py) * [DegreesOfSeparation](algs4/degrees_of_separation.py) * [Digraph](algs4/digraph.py) + * [DirectedDFS](algs4/directed_dfs.py) * 5 STRING diff --git a/algs4/depth_first_search.py b/algs4/depth_first_search.py index fc98eb3..507db05 100644 --- a/algs4/depth_first_search.py +++ b/algs4/depth_first_search.py @@ -34,7 +34,6 @@ def dfs(self, G, v): if __name__ == '__main__': import sys - print(sys.argv) f = open(sys.argv[1]) s = int(sys.argv[2]) V = int(f.readline()) diff --git a/algs4/directed_dfs.py b/algs4/directed_dfs.py new file mode 100644 index 0000000..b2b7a44 --- /dev/null +++ b/algs4/directed_dfs.py @@ -0,0 +1,56 @@ +""" + Execution: python directed_dfs.py digraph.txt s + Data files: https: // algs4.cs.princeton.edu / 42digraph / tinyDG.txt + https://algs4.cs.princeton.edu/42digraph/mediumDG.txt + https://algs4.cs.princeton.edu/42digraph/largeDG.txt + + Determine single-source or multiple-source reachability in a digraph + using depth first search. + Runs in O(E + V) time. + + % python directed_dfs.py tinyDG.txt 1 + 1 + + % python directed_dfs.py tinyDG.txt 2 + 0 1 2 3 4 5 + + % python directed_dfs.py tinyDG.txt 1 2 6 + 0 1 2 3 4 5 6 8 9 10 11 12 +""" + +from algs4.digraph import Digraph + + +class DirectedDFS: + + def __init__(self, G, sources): + self._marked = [False for _ in range(G.V)] + for s in sources: + s = int(s) + if not self._marked[s]: + self.dfs(G, s) + + def dfs(self, G, v): + self._marked[v] = True + for w in G.adj[v]: + if not self._marked[w]: + self.dfs(G, w) + + def marked(self, v): + return self._marked[v] + +if __name__ == '__main__': + import sys + f = open(sys.argv[1]) + V = int(f.readline()) + E = int(f.readline()) + g = Digraph(V) + for i in range(E): + v, w = f.readline().split() + g.add_edge(v, w) + + reachable = DirectedDFS(g, sys.argv[2:]) + + for v in range(g.V): + if reachable.marked(v): + print(str(v) + " ")