• + 0 comments

    Python

    class Graph:
        def __init__(self):
            self.adj_list = {}
        
        def add_edge(self, u, v):
            if u not in self.adj_list:
                self.adj_list[u] = []
            if v not in self.adj_list:
                self.adj_list[v] = []
            self.adj_list[u].append(v)
            self.adj_list[v].append(u)
    
        def add_city(self, u):
            if u not in self.adj_list:
                self.adj_list[u] = []
    
        def dfs(self, start, visited):
            visited.add(start)
            print("Visitando cidade", start)
            for neighbor in self.adj_list[start]:
                if neighbor not in visited:
                    self.dfs(neighbor, visited)
    
    def roadsAndLibraries(n, c_lib, c_road, cities):
        if c_road >= c_lib:
            return n * c_lib
        else:
            g = Graph()
            visited_cities = set()
            groups = []
        
            for city in range(1, n+1):
                g.add_city(city)
        
            for city in cities:
                g.add_edge(city[0],city[1])
                
            for city in range(1,n+1):
                if city not in visited_cities:
                    current_group = set()
                    g.dfs(city, current_group)
                    groups.append(current_group)
                    visited_cities.update(current_group)
            total_cost = 0
            for group in groups:
                num_cities = len(group)
                lib_cost = num_cities * c_lib
                road_cost = c_lib + (num_cities - 1) * c_road
                total_cost += min(lib_cost, road_cost)
            
            return total_cost