diff options
Diffstat (limited to 'sources')
-rw-r--r-- | sources/acyclicity.py | 48 |
1 files changed, 48 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)) |