Cod sursa(job #2594506)

Utilizator angelaAngela Visuian angela Data 6 aprilie 2020 10:11:35
Problema Componente tare conexe Scor 30
Compilator py Status done
Runda Arhiva educationala Marime 2.79 kb
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')