Pagini recente » Cod sursa (job #1095462) | Cod sursa (job #2963688) | Cod sursa (job #546300) | Cod sursa (job #1347623) | Cod sursa (job #2594506)
import sys
class Graph:
def __init__(self):
self.n = 0 # vertices
self.m = 0 # edges
self.outEdges = {} # dictionary of (adjacent) lists ;
self.inEdges = {} # dictionary of (adjacent) lists ;
self.stack = []
self.viz = []
self.scc = []
self.c = []
def readGraph(self, fileName):
try:
f = open(fileName, "r")
line = f.readline().strip()
line = line.split(" ")
self.n = int(line[0])
self.m = int(line[1])
# now we know the number (n) of empty lists as values in dictionary
self.inEdges = {k: [] for k in range(1, self.n + 1)}
self.outEdges = {k: [] for k in range(1, self.n + 1)}
self.viz = [False] * (self.n + 1)
for i in range(self.m):
line = f.readline().strip()
line = line.split(' ')
x = int(line[0])
y = int(line[1])
self.outEdges[x].append(y)
self.inEdges[y].append(x)
f.close()
except IOError as e:
print("An error occured - " + str(e))
raise e
def Dfs(self, x):
self.viz[x] = True
for y in self.outEdges[x]:
if self.viz[y] == True:
continue
self.Dfs(y)
self.stack.append(x)
def DfsT(self, x):
self.viz[x] = True
self.c.append(x)
for y in self.inEdges[x]:
if self.viz[y] == True:
continue
self.DfsT(y)
def Kosaraju(self):
self.viz = [False] * (self.n + 1)
for node in range(1, self.n + 1):
if self.viz[node] == False:
self.Dfs(node)
self.viz = [False] * (self.n + 1)
while (len(self.stack) != 0):
node = self.stack.pop()
if self.viz[node] == True:
continue
self.c = []
self.DfsT(node)
self.scc.append(self.c)
def printSCC(self, fileName):
try:
f = open(fileName, "w")
f.write(str(len(self.scc)))
f.write('\n')
for comp in self.scc:
comp.sort() #
for x in comp:
f.write(str(x))
f.write(' ')
f.write('\n')
f.close()
except IOError as e:
print("An error occured - " + str(e))
raise e
def printAdjList(self):
print(self.adj)
g = Graph()
g.readGraph('ctc.in')
g.Kosaraju()
g.printSCC('ctc.out')