Cod sursa(job #2928420)

Utilizator victormuraVictor Mura victormura Data 22 octombrie 2022 21:32:55
Problema Componente tare conexe Scor 0
Compilator py Status done
Runda Arhiva educationala Marime 1.32 kb
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()])