개발/algorithm

[백준 6118번] 숨바꼭질 - python

zzi_on2 2022. 1. 26. 17:25

문제 링크

https://www.acmicpc.net/problem/6118

 

6118번: 숨바꼭질

재서기는 수혀니와 교외 농장에서 숨바꼭질을 하고 있다. 농장에는 헛간이 많이 널려있고 재서기는 그 중에 하나에 숨어야 한다. 헛간의 개수는 N(2 <= N <= 20,000)개이며, 1 부터 샌다고 하자.   재

www.acmicpc.net

 

풀이 

- bfs 문제 

- 1번 노드로부터 모든 노드까지의 최단 거리 visited에 계산 

- visited의 최댓값 구한 후 최댓값의 최소 인덱스 출력, 최댓값 출력, 최댓값 개수 출력

from collections import deque, defaultdict

def bfs(v):
  q = deque()
  # 노드 번호와 거리 큐에 삽입 
  q.append((v,0))
  # 1번 노드 방문 기록 표시 
  visited[v] = 1 

  while q:
    x, index = q.popleft()

    for u in maps[x]:
        # 방문하지 않았다면 
      if visited[u] == 0:
        # 거리 하나 증가 
        visited[u] = index+1
        # 큐에 삽입 
        q.append((u, index+1))
  
# 1번 노드로부터 모든 노드까지 최단 거리 구하기 
n, m = map(int,input().split())

maps = defaultdict(list)

for _ in range(m):
  a,b = map(int,input().split())

  maps[a].append(b)
  maps[b].append(a)

visited = [0] * (n+1)
bfs(1)

# 가장 멀리 있는 노드까지의 거리 
answer = max(visited)

# 가장 멀리 있는 노드 중 가장 작은 노드 
for i in range(2,n+1):
  if visited[i] == answer:
    print(i,end =" ")
    break

# 그 헛간까지의 거리 
print(answer, end = " ")

# 그 헛간과 같은 거리를 갖는 헛간의 개수 
print(visited[2:].count(answer))