Cod sursa(job #2590514)

Utilizator conttestecontteste12345 contteste Data 28 martie 2020 10:54:49
Problema Componente tare conexe Scor 30
Compilator py Status done
Runda Arhiva educationala Marime 2.88 kb
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")