1240๋ฒ - ๋ ธ๋ ์ฌ์ด์ ๊ฑฐ๋ฆฌ
ํธ๋ฆฌ๊ฐ ์ฃผ์ด์ง๊ณ ๋ ธ๋ ์ฌ์ด์ ๊ฑฐ๋ฆฟ๊ฐ์ด ์ฃผ์ด์ง ๋ ๋ ธ๋ ๋ ๊ฐ๊ฐ ์ฃผ์ด์ก์ ๋ ํด๋น ๋ ธ๋ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ฉด ๋๋ ๋ฌธ์ ์ ๋๋ค.
์ด๋ฐ ์ฉ์ผ๋ก ๋ง์
๋๋ค.
๋ฌธ์ ๋ฅผ ๋ณด๊ณ 2์ฐจ์ ๋ฐฐ์ด์ DFS๋ก ํ๋ ๊ทธ๋ํ์ ๊ฐ์ ๊ฑฐ๋ฆฌ๊ฐ์ ๋ฃ์ด ํ์ดํ๋ฉด ๋๊ฒ ๊ตฌ๋! ํ์ฌ
for _ in range(N-1):
a,b,distance = map(int,input().split())
graph[a][b] = graph[b][a] = distance
์ด์ฐจ์ ๋ฐฐ์ด์ ํ๋ ๋ง๋ค์ด a์ b๊ฐ ์ด์ด์ ธ ์๋ค๋ ๊ฑธ ํํํ๊ณ ํด๋น ์ธ๋ฑ์ค value์ ๊ฑฐ๋ฆฌ๊ฐ์ ๋ฃ๊ณ
for i in range(len(graph[0])):
if not visited[i] and graph[N][i] != 0:
length += graph[N][i]
length_record.append(graph[N][i])
dfs(i,end)
if length_record:
length -= length_record.pop()
DFS ํ์์ ์งํํ์ฌ depth, ์ฆ ๊น์ด๊ฐ ์ฆ๊ฐํ ๋๋ง๋ค graph[N][i]์ value(๊ฑฐ๋ฆฟ๊ฐ)๋ฅผ ํฉ์ฐ์ฐํ์ฌ
if N == end:
ans.append(length)
์ต์ข
์ ์ผ๋ก ๋๊ฐ์ ๋ง๋๋ฉด ans์ ์ถ๊ฐ๋๋๋ก ์ฝ๋ฉํ๋...!
์ ๊ฐ ์๊ณ ์์์ต๋๋ค... DFS์์ ์ด์ฐจ์ ๋ฐฐ์ด์ ์์ ๋กญ๊ฒ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ์ปค์ ธ ๊ฒฐ๊ณผ๋ ์์ ๋กญ๊ฒ ๋์๋ฒ๋ฆฐ๋ค๋ ๊ฒ์...
์๋ ๋ฌธ์ ์ ์ ํ ์ฌํญ์
๋๋ค.
N์ ๋ฒ์๋ฅผ 1000, M์ ๋ฒ์๋ฅผ 1000์ผ๋ก ์ง์ ํ๊ณ ์์ต๋๋ค.
์ฌ๊ธฐ์ ์๊ฐํ ๊ฒ์ DFS ๊ทธ๋ํ๋ 1์ฐจ์์ ๋ฐฐ์ด๋ก ์ฉ๋์ ์ค์ด๋ 1000 x 1000 ํด๋ด์ผ ๋ฐฑ๋ง๋ฐ์ ์๋๋๊น ๊ฑฐ๋ฆฟ๊ฐ์ ๋ํ๋ด๋ ๊ทธ๋ํ๋ ๊ทธ๋๋ก 2์ฐจ์ ํ๊ธฐ๋ก ์ฌ์ฉํด๋ ๋๊ฒ ๋ค! ์ถ์์ต๋๋ค.
N,M = map(int,input().split())
visited = [0]*(N+1)
graph = [[]for _ in range(N+1)]
distance_graph = [[0]*(N+1) for _ in range(N+1)]
length = 0
ans = []
distance_tmp = []
DFS๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ๋ณ์๋ค๊ณผ ๋ฐฉ๋ฌธ์ฌ๋ถ, ๊ทธ๋ฆฌ๊ณ ์์ ์ธ๊ธํ๋ฏ์ด ๊ฑฐ๋ฆฟ๊ฐ๋ง์ ๋ํ๋ด๋ distance_graph์ ๋๋จธ์ง ๋ณ์๋ฑ์ ์ ์ธํด์ฃผ๊ฒ ์ต๋๋ค.
for _ in range(N-1):
a,b,distance = map(int,input().split())
distance_graph[a][b] = distance_graph[b][a] = distance
graph[a].append(b)
graph[b].append(a)
๊ฑฐ๋ฆฟ๊ฐ์ ๋ํ๋ด๋ ๊ทธ๋ํ๋ ์ ์ ์ฒ์ ํ์ดํ ๋ฐฉ์๊ณผ ๋์ผํ๊ฒ ์์ฑํด์ค๋๋ค.
๋ค๋ง ์ด์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ฅผ ๋ํ๋ด๋ ๊ทธ๋ํ๋ ์ฒ์ ํ์ดํ ๋ฐฉ์๊ณผ ๋ค๋ฅด๊ฒ ์์ ๊ฐ์ด ์์ฑํ์ฌ
์๋์๋ค๋ฉด ์์ ๊ฐ์ด ๋์ฌ ๊ทธ๋ํ๋ฅผ
1์ฐจ์์ ๋ฆฌ์คํธ๋ก ํจ์ถ์์ผ ๋ฉ๋ชจ๋ฆฌ ์ ํ์ ํผํ๋๋ก ํ๊ฒ ์ต๋๋ค.
ans_tmp = []
for _ in range(M):
a,b = map(int,input().split())
ans_tmp.append([a,b])
๋ค์์ผ๋ก ๊ฑฐ๋ฆฟ๊ฐ์ ๊ตฌํด์ค ๋ ธ๋๋ฅผ ์ ๋ ฅ๋ฐ์ต๋๋ค.
for values in ans_tmp:
dfs(values[0],values[1])
distance_tmp = []
visited = [0]*(N+1)
length = 0
์ด์ DFS ํจ์๋ฅผ ์ค๋นํ๊ฒ ์ต๋๋ค. values[0]์ ํ์์ ์์์ , values[1]์ ๋ณด๊ด๋ง ํ๊ณ ์๋ค๊ฐ ๋ง์ฝ ๋ณ์๊ฐ์ด values[1]๊ณผ ๊ฐ์์ง๋ค๋ฉด ans์ ์ต์ข ๊ฐ ์ถ๊ฐํ๊ณ return ํ๋ ์ฉ์ผ๋ก ์์ฑํ ์ฌ๊ท ์ข ๋ฃ์ ํ์ํ ๋ณ์์ ๋๋ค.
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**5)
๋ง์ฐฌ๊ฐ์ง๋ก ๋ฉ๋ชจ๋ฆฌ ์ข ๋ฃ์ ํ์ํ ํจ์๋ค ์์ฑํ๊ณ DFS ๋ถ๋ถ ๋ง์ ์์ฑํ๊ฒ ์ต๋๋ค.
def dfs(N,end):
global length
visited[N] = 1
๋ค์ด์ค๋ฉด ๋ฐฉ๋ฌธํ์ ํด์ฃผ๊ณ
if N == end:
ans.append(length)
return
์์ ๋ง์๋๋ ธ๋ฏ์ด ํ์์ค์ธ ๊ตฌ๊ฐ์ด end์ ๊ฐ๋ค๋ฉด ans์ ๋ต ์ถ๊ฐํ๊ณ return์ผ๋ก ํจ์์ข ๋ฃ ํ๊ฒ ์ต๋๋ค.
for values in graph[N]:
if not visited[values]:
ํ์ฌ ํ์์ค์ธ ๊ตฌ๊ฐ๊ณผ ์ฐ๊ฒฐ๋ ๋ ธ๋์์ ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๊ฐ ์๋ค๋ฉด
distance_tmp.append(distance_graph[N][values])
length += distance_tmp[-1]
ํ์ฌ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ distance_tmp์ ์ถ๊ฐํ๊ณ length(ํ์ฌ ๊ธธ์ด)์๋ distance_tmp[-1]์ ํฉ์ฐ์ฐํด์ค๋๋ค.
dfs(values,end)
๊ทธ๋ฆฌ๊ณ ์ฌ๊ท ๋ฃ๊ณ
if distance_tmp:
length -= distance_tmp.pop()
๊น์ด๊ฐ ์ต๋๋ก ๋๋ฌํด์ ๋ ์ด์ ํ์ํ ๋ ธ๋๊ฐ ์์ผ๋ฉด ํ์ฌ ๋ ธ๋์ ์ด์ ๋ ธ๋ ์ฌ์ด์ ๊ฑฐ๋ฆฌ (distance_tmp.pop)๋งํผ ๋นผ์ฃผ๋ฉด์ ํ์๋ ธ๋ ํ์์ ๋์์ค์๋ค.
for values in ans:
print(values)
๋ง์ง๋ง์ผ๋ก ์ถ๋ ฅํ๋ฉด ๋ฉ๋๋ค.
์ฌ๋ด์ด์ง๋ง ์ฌ์ค ์ด๋ฐ ๋ฌธ์ ๋ BFS๋ฅผ ์ฌ์ฉํ๋๊ฒ ๋ฉ๋ชจ๋ฆฌ ๋๋ ์๊ฐ์ด๊ณผ ๊ฑฑ์ ์์ด ํ๊ธฐ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋๋ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ๊ฐ์ ๋ก DFS๋ก ํ์ด ์ฌ์ฉ๋ ฅ์ ํฅ์์ํค๋ ๋ฐ๋ ๊ด์ฐฎ์ ๊ฒ ๊ฐ์ต๋๋ค.