Pagini recente » Cod sursa (job #573011) | Cod sursa (job #135881) | Cod sursa (job #2417747) | Cod sursa (job #901189) | Cod sursa (job #2590514)
class Graph:
def __init__(self):
self._dictIn={}
self._dictOut={}
def addVertex(self, vertex_id):
self._dictIn[vertex_id]=[]
self._dictOut[vertex_id]=[]
def addEdge(self, x, y):
self._dictIn[y].append(x)
self._dictOut[x].append(y)
def parseNOut(self, x):
return self._dictOut[x]
def parseNIn(self, x):
return self._dictIn[x]
def parseX(self):
return self._dictOut.keys()
def printGraph(self):
for node in self.parseX():
line = str(node) + ":"
for neighbour in self.parseNOut(node):
line += str(neighbour) + " "
print(line)
def dfs(self, node, visited_nodes, stack):
visited_nodes.append(node)
for neighbour in self.parseNOut(node):
if neighbour not in visited_nodes:
self.dfs(neighbour, visited_nodes, stack)
stack.append(node)
def dfs_reversed(self, node, visited_nodes, set_of_nodes, stack):
visited_nodes.append(node)
set_of_nodes.append(node)
for neighbour in self.parseNIn(node):
if neighbour not in visited_nodes:
self.dfs_reversed(neighbour, visited_nodes, set_of_nodes, stack)
stack.append(node)
def kosaraju(self):
visited_nodes = []
stack = []
for node in self.parseX():
if node not in visited_nodes:
self.dfs(node, visited_nodes, stack)
visited_nodes = []
result = []
while len(stack) > 0:
node = stack[-1]
del stack[-1]
if node in visited_nodes:
continue
set_of_nodes = []
self.dfs_reversed(node, visited_nodes, set_of_nodes, stack)
result.append(set_of_nodes)
return result
@staticmethod
def readGraphFromFile(file):
file_handler = open(file, "r")
graph = Graph()
lines = file_handler.readlines()
for line_index in range(0, len(lines)):
lines[line_index] = lines[line_index].strip()
sizes = lines[0].split(" ")
sizes[0] = int(sizes[0]) #number of nodes
sizes[1] = int(sizes[1]) #number of edges
for node in range(1, sizes[0]+1):
graph.addVertex(node)
for line_index in range(1, len(lines)):
nodes = lines[line_index].split(" ")
nodes[0] = int(nodes[0])
nodes[1] = int(nodes[1])
graph.addEdge(nodes[0], nodes[1])
return graph
mygraph = Graph.readGraphFromFile("ctc.in")
sets = mygraph.kosaraju()
file_out = open("ctc.out", "w")
file_out.write(str(len(sets))+"\n")
for component in sets:
line = ""
for node in component:
line += str(node) + " "
file_out.write(line+"\n")