summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sources/acyclicity.py48
-rw-r--r--tests/test_acyclicity.py13
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()