https://www.acmicpc.net/problem/20924
20924번: 트리의 기둥과 가지
첫 번째 줄에는 노드의 개수 $N$($1 \le N \le 200\,000$)과 루트 노드의 번호 $R$($1 \le R \le N$)이 주어진다. 이후 $N-1$개의 줄에 세 개의 정수 $a$, $b$, $d$($1 \le a, b \le N$, $ a \ne b$)가 주어진다. 이는 $a$번
www.acmicpc.net
DFS를 기둥의 길이를 찾는 데 한번, 그리고 가지 길이의 최댓값을 찾는 데 또 한번 총 두 번을 써서 해결할 수 있는 문제였다.
인접리스트를 이용하여 데이터를 받았고, 스택(q)에 탐색노드와 해당 노드까지의 거리를 추가하는 방식으로 풀었다.
처음에 런타임에러(TypeError)가 나서 멘붕이었는데.. 기가노드가 탐색노드인 경우에 해당 노드에 연결된 노드가 2개면 잘못된 값을 출력하는 문제가 있었다. 그래서 해당 경우에 예외처리를 해 주니 통과하였다.
또한 함수 안에서 global 변수를 선언하면 해당 변수의 type이 'function'으로 나와서 max함수로 비교가 되지 않았다. 그래서 함수 내에서 global 변수를 0으로 한번 더 초기화시켜줬다.
import sys
input = sys.stdin.readline
N, R = map(int, input().split())
graph = [[] for _ in range(N+1)]
for _ in range(N-1):
a, b, d = map(int, input().split())
graph[a].append([b,d])
graph[b].append([a,d])
visit = [False]*(N+1)
q = []
q.append([R,0])
visit[R] = True
column = 0
branch = 0
#기둥까지의 거리
def col():
global column
while(q):
v = q.pop()
if (len(graph[v[0]])>2):
q.append([v[0],0])
break
for i in graph[v[0]]:
if (visit[i[0]]==False):
visit[i[0]] = True
q.append([i[0],v[1]+i[1]])
column = v[1]
def branch():
global branch
branch = 0 #안하면 max에서 오류 발생
while(q):
v = q.pop()
if (len(graph[v[0]])==1):
branch = max(branch, v[1])
continue
for i in graph[v[0]]:
if (visit[i[0]]==False):
visit[i[0]] = True
q.append([i[0],v[1]+i[1]])
if (len(graph[R])==1):
col()
branch()
print(column, branch)
'알고리즘💻 > 그래프(DFS&BFS)' 카테고리의 다른 글
BOJ 1922번: 네트워크 연결 (0) | 2021.08.16 |
---|---|
BOJ 22352번: 항체 인식 (0) | 2021.08.16 |
BOJ 14940번: 쉬운 최단거리 (0) | 2021.08.14 |
BOJ 2210번: 숫자판 점프 (0) | 2021.08.12 |
BOJ 9372번: 상근이의 여행 (0) | 2021.08.09 |