Cod sursa(job #2929811)

Utilizator mihneagherghelMihnea Gherghel-Butan mihneagherghel Data 26 octombrie 2022 21:43:28
Problema Componente tare conexe Scor 0
Compilator py Status done
Runda Arhiva educationala Marime 1.57 kb
from queue import LifoQueue

def dfsRecursiv(nod,graf,viz,stackCTC):
    viz[nod]=1
    for i in graf[nod]:
        if viz[i]==0:
            dfsRecursiv(i,graf,viz,stackCTC)
    stackCTC.put(nod)

# functie ce gaseste compoenetele tare conexe
def componenta(nod,graf_invers,viz,curenta):
    viz[nod]=1
    for i in graf_invers[nod]:
        if(viz[i]==0):
            curenta.append(i)
            componenta(i,graf_invers,viz,curenta)

# Am utilizar algoritmul lui Kosaraju
#citire graf+constructie graf invers
f=open("ctc.in","r")
n,m=[int(x) for x in f.readline().split(" ")]
graf=[[] for i in range(0,n+1,1)] #O(n)
graf_invers=[[] for i in range(0,n+1,1)] #O(n)
for i in range(0,m,1): #O(m) 
    a,b=[int(x) for x in f.readline().split(" ")]
    graf[a].append(b)
    graf_invers[b].append(a)
f.close()

#DFS Recursiv+ creare coada
viz=[0 for i in range(0,n+1,1)] #O(n)
stackCTC=LifoQueue(maxsize=1000)
for i in range(1,n+1,1): #O(n)
    if(viz[i]==0):
        dfsRecursiv(i,graf,viz,stackCTC)

#Gasirea componentelor tare-conexe
viz=[0 for i in range(0,n+1,1)] #O(n)
componente=[]
while stackCTC.empty()==False: #O(n)
    nod=stackCTC.get()
    if(viz[nod]==0):
        componenta_nod=[nod]
        componenta(nod,graf_invers,viz,componenta_nod)
        componente.append(componenta_nod)

#afisare
f = open("ctc.out", "w")
f.write("{}\n".format(len(componente)))
for i in range(0,len(componente)):
    for j in componente[i]:
        f.write("{} ".format(j))
    f.write("\n")
f.close()

#complexitate O(n+m)