😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[BAEKJOON python] 2644_μ΄Œμˆ˜κ³„μ‚° λ³Έλ¬Έ

πŸ¦₯ μ½”ν…Œ/BAEKJOON

[BAEKJOON python] 2644_μ΄Œμˆ˜κ³„μ‚°

μ§•μ§•μ•ŒνŒŒμΉ΄ 2022. 10. 8. 00:12
728x90
λ°˜μ‘ν˜•
우리 λ‚˜λΌλŠ” κ°€μ‘± ν˜Ήμ€ μΉœμ²™λ“€ μ‚¬μ΄μ˜ 관계λ₯Ό μ΄Œμˆ˜λΌλŠ” λ‹¨μœ„λ‘œ ν‘œν˜„ν•˜λŠ” λ…νŠΉν•œ λ¬Έν™”λ₯Ό 가지고 μžˆλ‹€.
μ΄Œμˆ˜λŠ” 기본적으둜 λΆ€λͺ¨μ™€ μžμ‹ 사이λ₯Ό 1촌으둜 μ •μ˜ν•˜κ³  μ΄λ‘œλΆ€ν„° μ‚¬λžŒλ“€ κ°„μ˜ 촌수λ₯Ό κ³„μ‚°ν•œλ‹€.

예λ₯Ό λ“€λ©΄ λ‚˜μ™€ 아버지, 아버지와 ν• μ•„λ²„μ§€λŠ” 각각 1촌으둜 λ‚˜μ™€ ν• μ•„λ²„μ§€λŠ” 2촌이 되고, 아버지 ν˜•μ œλ“€κ³Ό ν• μ•„λ²„μ§€λŠ” 1촌, λ‚˜μ™€ 아버지 ν˜•μ œλ“€κ³ΌλŠ” 3촌이 λœλ‹€.

μ—¬λŸ¬ μ‚¬λžŒλ“€μ— λŒ€ν•œ λΆ€λͺ¨ μžμ‹λ“€ κ°„μ˜ 관계가 μ£Όμ–΄μ‘Œμ„ λ•Œ, 주어진 두 μ‚¬λžŒμ˜ 촌수λ₯Ό κ³„μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±

μ‚¬λžŒλ“€μ€ 1, 2, 3, …, n (1 ≤ n ≤ 100)의 μ—°μ†λœ 번호둜 각각 ν‘œμ‹œλœλ‹€.
μž…λ ₯ 파일의 첫째 μ€„μ—λŠ” 전체 μ‚¬λžŒμ˜ 수 n이 주어지고,
λ‘˜μ§Έ μ€„μ—λŠ” 촌수λ₯Ό 계산해야 ν•˜λŠ” μ„œλ‘œ λ‹€λ₯Έ 두 μ‚¬λžŒμ˜ λ²ˆν˜Έκ°€ 주어진닀.
μ…‹μ§Έ μ€„μ—λŠ” λΆ€λͺ¨ μžμ‹λ“€ κ°„μ˜ κ΄€κ³„μ˜ 개수 m이 주어진닀.
λ„·μ§Έ μ€„λΆ€ν„°λŠ” λΆ€λͺ¨ μžμ‹κ°„μ˜ 관계λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 두 번호 x,yκ°€ 각 쀄에 λ‚˜μ˜¨λ‹€. μ΄λ•Œ μ•žμ— λ‚˜μ˜€λŠ” 번호 xλŠ” 뒀에 λ‚˜μ˜€λŠ” μ •μˆ˜ y의 λΆ€λͺ¨ 번호λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
각 μ‚¬λžŒμ˜ λΆ€λͺ¨λŠ” μ΅œλŒ€ ν•œ λͺ…λ§Œ 주어진닀.

μž…λ ₯μ—μ„œ μš”κ΅¬ν•œ 두 μ‚¬λžŒμ˜ 촌수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜λ₯Ό 좜λ ₯
μ–΄λ–€ κ²½μš°μ—λŠ” 두 μ‚¬λžŒμ˜ μΉœμ²™ 관계가 μ „ν˜€ μ—†μ–΄ 촌수λ₯Ό 계산할 수 없을 λ•Œκ°€ μžˆλ‹€. μ΄λ•Œμ—λŠ” -1을 좜λ ₯

πŸ€ 1) DFS

# 1) dfs
n = int(input())
a, b = map(int, input().split())
t = int(input())

graph = [[] for i in range(n+1)]
visited = [0] * (n+1)

for i in range(t) :
    p, q = map(int, input().split())
    graph[p].append(q)
    graph[q].append(p)

def dfs(a) :
	for i in graph[a] :
		if not visited[i] :
			visited[i] = visited[a] + 1
			dfs(i)

dfs(a)

if visited[b] > 0 :
	print(visited[b])
else :
	print(-1)

# # input
# 9
# 7 3
# 7
# 1 2
# 1 3
# 2 7
# 2 8
# 2 9
# 4 5
# 4 6
# # result
# 3

 

πŸ€ 2) BFS

# 2) bfs
from collections import deque

n = int(input())
p, q = map(int, input().split())
t = int(input())

graph = [[] for _ in range(n+1)]
visited = [-1] * (n+1)

for i in range(t) :
	x, y = map(int, input().split())
	graph[x].append(y)
	graph[y].append(x)

def bfs() :
	queue = deque([p])
	visited[p] = 0

	while queue :
		result = queue.popleft()

		for i in graph[result] :
			if visited[i] == -1 :
				visited[i] = visited[result] + 1
				queue.append(i)

bfs()

if visited[q] == -1 :		# p λž‘ μ—°κ²° X
	print(-1)
else :
	print(visited[q])

# input
# 9
# 7 3
# 7
# 1 2
# 1 3
# 2 7
# 2 8
# 2 9
# 4 5
# 4 6
# result
# 3
728x90
λ°˜μ‘ν˜•
Comments