# 문제
2644호: 합동 계산
사람들 1, 2, 3, … , n(1 ≤ n ≤ 100). 입력 파일의 첫 번째 줄에는 총 인원 n이 지정되고 두 번째 줄에는 학위를 계산할 서로 다른 두 사람의 수가 지정됩니다.
www.acmicpc.net
# 코드
## 면세점
import sys
n = int(sys.stdin.readline()) # 전체 사람의 수
a,b = map(int,sys.stdin.readline().split()) # 촌수를 계산해야하는 a,b
m = int(sys.stdin.readline()) # 관계의 개수
ddict = ( () * 1 for _ in range(n+1)) # 인접리스트 만들기
visit = (False) * (n+1)
for i in range(m) :
x,y = map(int,sys.stdin.readline().split())
ddict(x).append(y)
ddict(y).append(x)
def dfs(a,cnt) :
if a==b :
return cnt
re = -1
for next in ddict(a) :
if not visit(next) :
visit(next) = True
re = max(dfs(next,cnt+1),re)
return re
visit(a) = True
result = dfs(a,0)
if result== None :
print(-1)
else :
print(result)
## BFS
import sys
from collections import deque
n = int(sys.stdin.readline()) # 전체 사람의 수
a,b = map(int,sys.stdin.readline().split()) # 촌수를 계산해야하는 a,b
m = int(sys.stdin.readline()) # 관계의 개수
ddict = ( () * 1 for _ in range(n+1)) # 인접리스트 만들기
visit = (False) * (n+1)
for i in range(m) :
x,y = map(int,sys.stdin.readline().split())
ddict(x).append(y)
ddict(y).append(x)
## BFS (성공) ##
## start a, target b
dq = deque()
dq.append((a,0))
visit(a) = True
while len(dq) !
= 0 :
cur = dq.popleft() # ( 현재값, 카운터 )
for item in ddict(cur(0)) :
next = (item, cur(1) + 1)
if visit(next(0)) == False :
if next(0) == b :
print(next(1))
exit()
else :
visit(next(0)) = True # 방문처리
dq.append(next) # 큐에 넣기
print(-1)
# 해결하다
- 이것은 간단한 인접 목록을 사용하여 쉽게 해결할 수 있습니다.
- BFS의 경우 방문 처리 요건을 잘 생각해보면 쉽게 해결된다.
- 도수 계산이기 때문에 만나는 지점은 무조건 최단 거리이기 때문에 BFS나 DFS 둘 다 사용 가능하다.
- 재귀적 방법으로 DFS를 풀 때 무조건 실패 사례가 충족됩니다.
이를 고려하지 않고 return dfs()와 같은 방식으로 풀면 오답이 나올 수 있습니다. - DFS에서는 비정상적인 조건(복원..)이 없으면 스택을 생성하여 역추적을 해결해야 합니다.