#!/bin/python3
from pprint import pprint
import sys
from collections import defaultdict
def dfs(graph, start):
visited, stack = set(), [start]
while stack: # dfs는 stack을 이용한다.
vertex = stack.pop()
if vertex not in visited:
visited.add(vertex)
stack.extend(graph[vertex] - visited) # 해당 정점에 연결된 것들을 stack에 넣는다.
return visited
def roadsAndLibraries(n, c_lib, c_road, cities):
total_cost = 0
if c_road >= c_lib or len(cities) == 0:
return n*c_lib # 도서관이 싸니까 도로를 만들 이유가 없다.
else: # here be real shits
city_graph = defaultdict(set) # 저절로 set이 만들어지기 때문에 add만 하면 됨.
connected_cities = set() # might make this into a set
for i in cities:
city_graph[i[0]].add(i[1])
city_graph[i[1]].add(i[0])
connected_cities.add(i[0])
connected_cities.add(i[1])
# print(city_graph)
# print(connected_cities)
isolated_cities = set([i+1 for i in range(n)]) - connected_cities
while connected_cities: # dfs를 이용하여 도시들을 돌아다닌다. 그리고 도시들이 비어질 때까지 돌아다닌다. 그리고 도시들은 한 묶음(여러그룹일 것이다.)에 끝나지 않는 경우가 많기 때문에 dfs를 여러번 실행해야 한다.
# if connected_cities: # it's wrong. Becuase the cities will have multiple groups.
temp = connected_cities.pop()
component = dfs(city_graph, temp)
# print('component', component)
total_cost += (len(component) - 1)*c_road + c_lib # 라이브러리 하나에 도로 여러개
connected_cities -= component # 지들끼리 연결된 component connected_ciites에서 제외
return total_cost + len(isolated_cities)*c_lib
# 모든 도시가 도서관을 접할 수 있도록 해야 한다.
# 모든 도시에 도서관을 만들거나
# 도서관을 하나 만들어서 연결되어 있는 도시(정점)끼리 도로를 만들어야 한다.
# (도로가 연결되어 있지 않다면 도서관을 연결해야 하겠지...)
#if __name__ == "__main__":
q = int(input().strip())
for a0 in range(q):
n, m, c_lib, c_road = input().strip().split(' ')
n, m, c_lib, c_road = [int(n), int(m), int(c_lib), int(c_road)]
cities = []
for cities_i in range(m):
cities_t = [int(cities_temp) for cities_temp in input().strip().split(' ')]
cities.append(cities_t)
result = roadsAndLibraries(n, c_lib, c_road, cities)
print(result)
2018년 3월 31일 토요일
[hackerrank][python]Roads and Libraries
https://www.hackerrank.com/challenges/torque-and-development/problem
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기