[파이썬] 백준 16437: 양 구출 작전 (골드3)
16437번: 양 구출 작전
2, 3, 5번에 사는 모든 양들은 1번 섬으로 갈 수 있지만 7번 섬에 사는 양들은 1번 섬으로 가기 위하여 6번 섬을 거쳐야 하는데 6번 섬에 사는 늑대들의 수가 7번 섬에 사는 양들의 수보다 많으므로
www.acmicpc.net
문제
풀이
0. 방향성 생각
- DFS
- 자식노드 정보 받아서 부모노드 업데이트
- 양은 +, 늑대는 -로 생각하기
- 양-늑대 > 0=이면 그대로 리턴, 양-늑대 < 0이면 0 리턴 (남은 양 0)
1. 입력
import sys
input = lambda : sys.stdin.readline().rstrip()
sys.setrecursionlimit(10**6)
n = int(input())
tree = [[] for _ in range(n+1)]
info = {i:0 for i in range(n+1)}
visit = [False]*(n+1)
for i in range(2,n+1):
a,b,c = input().split()
b,c = int(b),int(c)
tree[i].append(c)
tree[c].append(i)
if a == 'S': info[i] += b
else: info[i] -= b
- 양은 양수, 늑대는 음수로 받아주기.
- 중복 탐색 방지를 위해 visit[node] = False로 초기화
2. 함수 정의
def dfs(x):
if visit[x]: return 0
remain = info[x]
visit[x] = True
for nx in tree[x]:
temp = dfs(nx)
remain += max(temp,0)
return remain
print(dfs(1))
- 현재 노드를 info[x]로 받고 자식 노드에서 받아온 dfs값과 0 중 큰 값을 remain에 더해주기
전체코드
import sys
input = lambda : sys.stdin.readline().rstrip()
sys.setrecursionlimit(10**6)
n = int(input())
tree = [[] for _ in range(n+1)]
info = {i:0 for i in range(n+1)}
visit = [False]*(n+1)
for i in range(2,n+1):
a,b,c = input().split()
b,c = int(b),int(c)
tree[i].append(c)
tree[c].append(i)
if a == 'S': info[i] += b
else: info[i] -= b
def dfs(x):
if visit[x]: return 0
remain = info[x]
visit[x] = True
for nx in tree[x]:
temp = dfs(nx)
remain += max(temp,0)
return remain
print(dfs(1))
코멘트
'Algorithm > Graph' 카테고리의 다른 글
[파이썬] 백준 1833 : 고속철도 설계하기 (골드3) (0) | 2023.11.05 |
---|---|
[파이썬] 백준 2151 : 거울설치 (골드3) (0) | 2023.10.08 |
[파이썬] 백준 1068 : 트리 (골드5) (0) | 2023.09.14 |
[파이썬] 백준 1600 : 말이 되고픈 원숭이 (골드3) (0) | 2023.09.06 |
[파이썬] 백준 1261 : 알고스팟 (골드4) (0) | 2023.09.06 |
[파이썬] 백준 1963 : 소수 경로 (골드4) (0) | 2023.09.06 |
[파이썬] 백준 6087 : 레이저 통신 (골드3) (0) | 2023.09.06 |
댓글