Pagini recente » Cod sursa (job #2198560) | Cod sursa (job #2697304) | Cod sursa (job #2909215) | Cod sursa (job #1371210) | Cod sursa (job #2929811)
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)