Pagini recente » Cod sursa (job #2651813) | Cod sursa (job #237245) | Cod sursa (job #2662323) | Cod sursa (job #2651823) | Cod sursa (job #2928420)
import collections
from typing import List, Dict
with open("ctc.in", "r") as f:
n, m = (int(x) for x in f.readline().split(" "))
lines = [line.split() for line in f.readlines()]
edges = [(int(u), int(v)) for u, v in lines]
adj_list = collections.defaultdict(list)
inverted_adj_list = collections.defaultdict(list)
for u, v in edges:
adj_list[u].append(v)
inverted_adj_list[v].append(u)
used = {i: 0 for i in range(1, n+1)}
def dfp(node: int, neighbours: Dict[int, List[int]], adj: List[int]):
used[node] = 1
for child in neighbours[node]:
if used[child] == 0:
dfp(child, neighbours, adj)
adj.append(node)
def dfm(node: int, neighbours: Dict[int, List[int]], adj: List[int]):
used[node] = 2
for child in neighbours[node]:
if used[child] == 1:
dfm(child, neighbours, adj)
adj.append(node)
cycles = collections.defaultdict(list)
count = 0
for node in range(1, n+1):
if used[node] != 0:
continue
adj = []
dfp(node, adj_list, adj)
dfm(node, inverted_adj_list, cycles[count])
count += 1
for used_node in adj:
if used[used_node] == 1:
used[used_node] = 0
with open("ctc.out", "w") as f:
f.write(str(count))
f.write("\n")
f.writelines([" ".join(str(x) for x in line) + '\n' for line in cycles.values()])