Pagini recente » Cod sursa (job #2776196) | Cod sursa (job #1584984) | Cod sursa (job #2488595) | Cod sursa (job #2155754) | Cod sursa (job #2931679)
#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')