diff options
author | Haidong Ji | 2020-05-21 21:46:55 -0500 |
---|---|---|
committer | Haidong Ji | 2020-05-21 21:46:55 -0500 |
commit | b8349cfc102edc3964868c6ff3299e6537c36ae1 (patch) | |
tree | 5a2f2681148c028616099861763ab7d240c50f3d | |
parent | 1cf5ca9ec07e2c3c125f075c10b2ba713dbc7c7c (diff) |
Check if DAG graph done!
-rw-r--r-- | sources/acyclicity.py | 48 | ||||
-rw-r--r-- | tests/test_acyclicity.py | 13 |
2 files changed, 61 insertions, 0 deletions
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() |