From b8349cfc102edc3964868c6ff3299e6537c36ae1 Mon Sep 17 00:00:00 2001 From: Haidong Ji Date: Thu, 21 May 2020 21:46:55 -0500 Subject: Check if DAG graph done! --- sources/acyclicity.py | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ tests/test_acyclicity.py | 13 +++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 sources/acyclicity.py create mode 100644 tests/test_acyclicity.py diff --git a/sources/acyclicity.py b/sources/acyclicity.py new file mode 100644 index 0000000..40cdd28 --- /dev/null +++ b/sources/acyclicity.py @@ -0,0 +1,48 @@ +# Uses python3 + +import sys + + +def explore(adj, v, visited, prev, postv, clock): + visited.append(v) + prev[v] = clock[0] + clock[0] = clock[0] + 1 + + for n in adj[v]: + if n not in visited: + explore(adj, n, visited, prev, postv, clock) + + postv[v] = clock[0] + clock[0] = clock[0] + 1 + + +def dfs(adj, visited, prev, postv, clock): + for v in range(len(adj)): + if v not in visited: + explore(adj, v, visited, prev, postv, clock) + + +def acyclic(adj): + visited = [] + prev = [0 for i in range(len(adj))] + postv = [0 for i in range(len(adj))] + clock = [0] + dfs(adj, visited, prev, postv, clock) + + for u in range(len(adj)): + for v in adj[u]: + if postv[u] <= postv[v]: + return 1 + return 0 + + +if __name__ == '__main__': + input = sys.stdin.read() + data = list(map(int, input.split())) + n, m = data[0:2] + data = data[2:] + edges = list(zip(data[0:(2 * m):2], data[1:(2 * m):2])) + adj = [[] for _ in range(n)] + for (a, b) in edges: + adj[a - 1].append(b - 1) + print(acyclic(adj)) diff --git a/tests/test_acyclicity.py b/tests/test_acyclicity.py new file mode 100644 index 0000000..2eb8577 --- /dev/null +++ b/tests/test_acyclicity.py @@ -0,0 +1,13 @@ +import unittest +from sources.acyclicity import acyclic + + +class MyTestCase(unittest.TestCase): + def test_something(self): + adj = [[1], [2], [0], [0]] + + self.assertEqual(1, acyclic(adj)) + + +if __name__ == '__main__': + unittest.main() -- cgit v1.2.3