๐ฉ๐ปโ๐ป๋ฌธ์ ์ค๋ช
[์ด์ฝํ
Ch17-40] ์จ๋ฐ๊ผญ์ง
โ๏ธIdea Sketch
๋ฌธ์ ์์ฝ
์ต๋จ๊ฒฝ๋ก ์ค ๊ฐ์ฅ ํฐ ๊ฐ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
๋ฌธ์ ์์ "์ฌ๊ธฐ์ ๊ฑฐ๋ฆฌ๋ผ ํจ์ ์ง๋์ผ ํ๋ ๊ธธ์ ์ต์ ๊ฐ์์ด๋ค. " ๋ผ๊ณ ๋ช
์ํ๋ค. ๋ฐ๋ผ์ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ฉด ๋๋ค.
์ถ๋ฐ ํ๊ฐ์ 1๋ฒ์ด๋ค.
1๋ฒ ํ๊ฐ์์ x๋ฒ ํ๊ฐ๊น์ง์ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๋ชจ๋ ๊ตฌํ๊ณ , ๊ทธ ์ค ๊ฐ์ฅ ํฐ ๊ฐ์ ์ฐพ์์ผ ํ๋ค.
๊ฐ์ค์น๊ฐ ์๊ณ ๋ชจ๋ ํ๊ฐ์ ํ์ํด์ผ ํ๋ค.
์๊ฐ๋ณต์ก๋
O(V + E)
BFS์ ๊ทธ๋ํ๋ฅผ ์ธ์ ๋ฆฌ์คํธ๋ก ๊ตฌํํ๋ฉด ์ด O(V + E)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
BFS๋ ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํ๋ฏ๋ก O(V)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค. ์ด ๋ ํ ์ ์ ์ ๋ฐฉ๋ฌธํ ๋๋ง๋ค ๊ฐ์ ์ ํตํด ์ธ์ ํ ์ ์ ์ ๋ฐฉ๋ฌธํ๋ค. ๋ชจ๋ ๊ฐ์ ๋ ๋ฐฉ๋ฌธํ๋ฏ๋ก O(E)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค. ๋ฐ๋ผ์ BFS์ ์ด ์๊ฐ๋ณต์ก๋๋ ๋์ ํฉํ O(V + E)์ด๋ค.
์๊ณ ๋ฆฌ์ฆ : BFS
์ต๋จ๊ฒฝ๋ก๋ฅผ ๋ชจ๋ ๊ตฌํ๊ณ , ๊ทธ ์ค ๊ฐ์ฅ ํฐ ๊ฐ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค. ๋ชจ๋ ์ ์ ์ ํ์ํด์ผ ํ๊ณ ๊ฐ์ค์น๊ฐ ์๋ค. ๋ฐ๋ผ์ BFS ๋๋น์ฐ์ ํ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ตฌํํ๋ค.
โ๏ธ๋ด ์์ค์ฝ๋
- graph์ ์ธ์ ๋ฆฌ์คํธ๋ก ๊ตฌํํ๋ค.
- visited์ 1๋ฒ ํ๊ฐ์์์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๋ค. ์ด๊ธฐ๊ฐ์ -1์ด๊ณ , ์ถ๋ฐ์ง 1๋ฒ ํ๊ฐ์ visited ์ด๊ธฐ๊ฐ์ 0์ด๋ค. ์ธ์ ํ๊ฐ y๋ฅผ ๋ฐฉ๋ฌธํ ๋๋ง๋ค ์ด์ ํ๊ฐ x์ visited ๊ฐ์ 1์ ๋ํ ๊ฐ์ ์ ์ฅํ๋ค.
- ์ต์ข ์ ์ผ๋ก ์จ์ด์ผ ํ๋ ํ๊ฐ ๋ฒํธ num, ๊ทธ ํ๊ฐ๊น์ง์ ๊ฑฐ๋ฆฌ leng, ๊ทธ ํ๊ฐ๊ณผ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ๋ ํ๊ฐ์ ๊ฐ์ cnt๋ฅผ ์ถ๋ ฅํ๋ค. visited๋ฅผ ๋ฐํ์ผ๋ก ๊ณ์ฐํ๋ค.
์ ์ฒด ์ฝ๋
import sys
from collections import deque
si = sys.stdin.readline
n, m = map(int, si().split())
graph = [[] for _ in range(n + 1)]
visited = [-1] * (n + 1)
for _ in range(m):
a, b = map(int, si().split())
graph[a].append(b)
graph[b].append(a)
def bfs(start):
queue = deque([start])
visited[start] = 0
while queue:
x = queue.popleft()
for y in graph[x]:
if visited[y] == -1:
visited[y] = visited[x] + 1
queue.append(y)
bfs(1)
leng = max(visited)
num = visited.index(leng)
cnt = visited.count(leng)
print(num, leng, cnt)