Pagini recente » Cod sursa (job #2255659) | Cod sursa (job #1047046) | Cod sursa (job #2633751) | Cod sursa (job #2102613) | Cod sursa (job #2929814)
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