Cod sursa(job #2929814)

Utilizator manila02Pop Andreea manila02 Data 26 octombrie 2022 21:59:42
Problema Componente tare conexe Scor 0
Compilator py Status done
Runda Arhiva educationala Marime 1.73 kb
from collections import deque
from copy import deepcopy

#Citirea din fisier, crearea grafului si a grafului transpus
with open('ctc.in', 'r') as fin:
    n, m = fin.readline().split()
    n, m = int(n), int(m)
    graf = {i + 1: [] for i in range(n)}
    grafTranspus = {i + 1: [] for i in range(n)}
    for k in range(m):
        i,j = fin.readline().split()
        i, j = int(i), int(j)
        graf[i].append(j)
        grafTranspus[j].append(i)

vizitat = [0 for i in range(n+1)]
stiva = deque([])

#Prima oara parcurg cu DFS graful initial si introducem in stiva fiecare varf la momentul
#la care este finalizat
def DFS(graf, i):
    vizitat[i] = 1
    for vf in graf[i]:
        if vizitat[vf] == 0:
            DFS(graf, vf)
    stiva.append(i)

for x in range(1, n+1):
    if vizitat[x] == 0:
        DFS(graf, x)


componente = []

#marchez iar varfurile ca fiind nevizitate
vizitat = [0 for i in range(n+1)]
stack = deepcopy(stiva)

#Acum parcurg cu DFS graful transpus luand varfurile in ordinea in care
#sunt extrase din stiva (descrescator dupa timpul de finalizare de la
#pasul anterior)
while stack:
    x = stack.pop()
    if vizitat[x] == 0:
        #Reinitializez stiva ca fiind goala, astfel la fiecare apel dfs a grafului transpus,
        #la final in stiva voi avea varfurile care formeaza o ctc
        stiva = deque([])
        DFS(grafTranspus, x)
        componente.append(list(stiva))

#Scrierea in fisierul de output
with open('ctc.out', 'w') as fout:
    print(len(componente), file=fout)
    for comp in componente:
        for idx in comp:
            print(idx,end = " ", file=fout)
        print(file=fout)

#Complexitate: O(n+m) - 2 parcurgeri, constructia grafului transpus