본문 바로가기
백준

[python] 17471. 게리맨더링

by DylanMsK 2019. 10. 19.

문제 출처

17471. 게리맨더링

 

풀이


from itertools import combinations

N = int(input())
population = list(map(int, input().split()))
connection = {i: [j-1 for j in list(map(int, input().split()))[1:]] for i in range(N)}

def is_connected(comb):
    check = [1 if i in comb else 0 for i in range(N)]
    visited = [0]*N
    visited[list(comb)[0]] = 1
    q = connection[list(comb)[0]]
    while q:
        nxt = []
        for i in q:
            if check[i] and not visited[i]:
                nxt += connection[i]
                visited[i] = 1
        q = set(nxt)

    for i in range(N):
        if check[i] and not visited[i]:
            return False
    else:
        return True

def diff(a, b):
    sum_a = sum([population[i] for i in a])
    sum_b = sum([population[i] for i in b])
    return abs(sum_a - sum_b)


min_ = 1e10
for k in range(1, N//2+1):
    for comb in combinations(list(range(N)), k):
        a = set(comb)
        b = set(range(N)) - a
        if is_connected(a) and is_connected(b):
            min_ = min(min_, diff(a, b))

if min_ == 1e10:
    print(-1)
else:
    print(min_)
    

'백준' 카테고리의 다른 글

[python] 15953. 상금 헌터  (0) 2019.10.22
[python] 2630. 색종이 만들기  (0) 2019.10.21
[python] 17143. 낚시왕  (0) 2019.10.19
[python] 17472. 다리 만들기 2  (0) 2019.10.19
[python] 2146. 다리 만들기  (0) 2019.10.17