import itertools
import collections
def bfs(arr,team):
q=collections.deque()
q.append(arr)
cnt=1
visited[arr]=True
while q:
node=q.popleft()
for k in graph[node]:
if visited[k]==False and k in team:
visited[k]=True
q.append(k)
cnt+=1
if cnt==len(team):
return True
else:
return False
N=int(input())
arr=list(range(1,N+1))
people=[0]
people.extend(list(map(int,input().split())))
graph=[[]]
people_total=sum(people)
for i in range(N):
temp=list(map(int,input().split()))
graph.append(temp[1:])
min_number=999999999999999
for i in range(1,N//2+1):
b=itertools.combinations(arr,i)
for k in b:
a_team=list(k)
b_team=list(set(arr)-set(k))
visited=[False]*(N+1)
if bfs(a_team[0],a_team) and bfs(b_team[0],b_team):
a_team_sum=0
for tt in a_team:
a_team_sum+=people[tt]
b_team_sum=people_total-a_team_sum
if abs(b_team_sum-a_team_sum)<=min_number:
min_number=abs(b_team_sum-a_team_sum)
if min_number==0:
break
if min_number>1000:
print(-1)
else:
print(min_number)
기본적인 그래프 이론이다.
기본 컨셉은 combination을 이용해 전체 N에서 절반만큼만 구한다. 이유는 조합은 n-k 와 k일떄의 조합은 같기 때문이다.
그렇게 구한 조합에서 set을 이용해서 서로 뺄샘으로 a_team과 b_team을 구하고, 경로탐색을 통해 서로 이어진 숫자와 팀의 길이와 같은지 구분을 하고, 게리멘더링이 성립되는경우에 두 팀간의 격차를 구하고, 최소값을 갱신해준다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ] 1486 등산 (0) | 2021.01.13 |
---|---|
[BOJ] 1916 최소 비용 구하기 (0) | 2021.01.13 |
[BOJ] 14500 테트로미노 (0) | 2021.01.12 |
[BOJ] 11559 puyo puyo (0) | 2021.01.12 |
[BOJ] 3055 탈출 (0) | 2021.01.11 |