Cod sursa(job #2931679)

Utilizator rstrIoana Stratan rstr Data 31 octombrie 2022 18:36:12
Problema Componente tare conexe Scor 0
Compilator py Status done
Runda Arhiva educationala Marime 1.5 kb
#Aplicare alg. Kosaraju => Complexitate O(n+m)
#Citire din fisier nr varfuri si nr muchii si memorare
f = open("ctc.in","r")
line = f.readline()
s = [x for x in line.split()]
n = int(s[0])
m = int(s[1])

#Creare lista de adiacenta
lad = []
for x in range(n+1):
    lad.append([]);

#Citire din fisier muchii si memorare
for i in range(m):
    line = f.readline()
    s = [x for x in line.split()]
    lad[int(s[0])].append(int(s[1]))

#Prima parcurgere dfs si formarea stack-ului
stack = []
viz = []
for x in range(n+1):
    viz.append(0)

def dfs(x):
    viz[x] = 1
    for vec in lad[x]:
        if viz[vec] == 0:
            dfs(vec)
    stack.append(x)

for nod in range(1,n+1):
    if viz[nod] == 0:
        dfs(nod)


stack.reverse()

#Inversarea adiacentelor
lad_inv = []
for x in range(n+1):
    lad_inv.append([]);

for i in range(1,n+1):
    for j in lad[i]:
        lad_inv[j].append(i)

#A doua parcurgere dfs si stabilirea componentelor tare conexe

def dfs_rev(x):
    global comp
    viz[x] = 1
    comp.append(x)
    for vec in lad_inv[x]:
        if viz[vec] == 0:
            dfs_rev(vec)

viz = []
comp = []
ctc = 0
rez = []

for x in range(n+1):
    viz.append(0)

for x in stack:
    if viz[x] == 0:
        dfs_rev(x)
    else:
        continue
    ctc += 1
    rez.append(comp)
    comp = []

print(rez)
g=open("ctc.out","w")
g.write(str(ctc) + '\n')
for i in rez:
    for j in i:
        g.write(str(j) + ' ')
    g.write('\n')