각 점에 가중치가 부여된 트리가 주어집니다. 당신은 다음 연산을 통하여, 이 트리의 모든 점들의 가중치를 0으로 만들고자 합니다.
하지만, 모든 트리가 위의 행동을 통하여 모든 점들의 가중치를 0으로 만들 수 있는 것은 아닙니다. 당신은 주어진 트리에 대해서 해당 사항이 가능한지 판별하고, 만약 가능하다면 최소한의 행동을 통하여 모든 점들의 가중치를 0으로 만들고자 합니다.
트리의 각 점의 가중치를 의미하는 1차원 정수 배열 a
와 트리의 간선 정보를 의미하는 edges
가 매개변수로 주어집니다. 주어진 행동을 통해 트리의 모든 점들의 가중치를 0으로 만드는 것이 불가능하다면 -1을, 가능하다면 최소 몇 번만에 가능한지를 찾아 return 하도록 solution 함수를 완성해주세요. (만약 처음부터 트리의 모든 정점의 가중치가 0이라면, 0을 return 해야 합니다.)
a | edges | result |
---|---|---|
[-5,0,2,1,2] | [[0,1],[3,4],[2,3],[0,3]] | 9 |
[0,1,0] | [[0,1],[1,2]] | -1 |
a
의 합이 0이 아닌 경우이다.a
의 합이 0이 아닌 경우 -1 반환# 코드
import sys
from collections import deque
sys.setrecursionlimit(300000)
answer = 0
def dfs(x, a, tree, visited):
global answer
# 현재 노드 탐색 표시
visited[x] = 1
for y in tree[x]:
# 탐색하지 않은 노드일 경우 연산 진행
if not visited[y]:
a[x] += dfs(y, a, tree, visited)
# 연산 횟수 추가
answer += abs(a[x])
# 현재 노드의 값 부모 노드로 전달
return a[x]
def solution(a, edges):
global answer
# 0을 만들 수 있는지 검사
if sum(a) != 0:
return -1
# 트리 생성
tree = {i : [] for i in range(len(a))}
# 각 노드의 자식 노드 추가
for u, v in edges:
tree[u].append(v)
tree[v].append(u)
# 방문 표시 리스트
visited = [0] * len(a)
# DFS 탐색
dfs(0, a, tree, visited)
# 결과 반환
return answer