728x90
๐ ์ฝ๋์ 4503 - ๋ฐ์ด๋ฌ์ค(BFS)
๐ก ๋์ ํ์ด
์ด์ ํ์๋ ๋ฌธ์ ๋ฅผ BFS๋ก ํ์ด๋ดค๋ค.
DFS๋ ํ ๋ ธ๋์์ ์ธ์ ๋ ธ๋๊ฐ ๋ ์์ ๋๊น์ง ๋๊น์ง ํ๊ณ ๋ค์ด๊ฐ๋๋ฐ, BFS๋ ํ ๋ ธ๋์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด ์ฃผ๋ณ ์ธ์ ๋ ธ๋๋ฅผ ์ฐพ๋๋ค.
BFS๋ Queue
๋ฅผ ์ด์ฉํด์ ํ๋ฉด ๋๋๋ฐ, ์ด์ ์ฒ๋ผ flag
, check
ํ์์ผ๋ก ํ์ด๋ณด์.
BFS๋ฐฉ์์ ์ ์ฒด์ ์ธ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ๋ค.(Queue๋ ์ ์ ์ ์ถ์์ ๊ธฐ์ตํ์.)
- ์์ํ๋ ๊ฐ์ Queue์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- Queue์์ ํ์ฌ ๋ค์ด์๋ ๊ฐ(๋ ธ๋)์ ๋บ๋ค.
- ํด๋น ๋ ธ๋์ ์ธ์ ํ ๋ ธ๋ ์ค์์ ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ๋ชจ๋ ํ์ ๋ฃ๋๋ค.
- 2~3๋ฒ์ ๊ณผ์ ์ ๋ ์ด์ ํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
Flag
, Check
๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
Flag
C
์ ๋์ผํ ๋ฒ์ ์ ์ฒด๋ฅผFalse
๋ก ์ ์ธํด๋๊ณ , ํ์ฌQueue
์ ๋ค์ด๊ฐ์๋ ๊ฐ์ ๊บผ๋์ ๋ ํด๋น ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ์ ์ด ์๋ค๋ฉด(ํด๋น ๊ฐ์ดFalse
์ด๋ฉด)True
๋ก ๋ง๋ ๋ค.while
๋ฌธ์ด๋ฏ๋ก ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ ๊ฐ์pop
์ํค๊ณQueue
์ ๋จ์์๋ ๊ฐ์ ์ฐจ๋ก๋๋ก ํ์ธํ๋ค.(Queue๊ฐ ์์ด์ง ๋๊น์ง)
Check
๋น ๋ฆฌ์คํธ๋ฅผ ์ ์ธํ๊ณ ํ์ฌQueue
์ ๋ค์ด๊ฐ์๋ ๊ฐ์ ๊บผ๋์ ๋ ํด๋น ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ์ ์ด ์๋ค๋ฉด(๋น ๋ฆฌ์คํธ์ ํด๋น ๊ฐ์ด ์์ผ๋ฉด) ๋น ๋ฆฌ์คํธ์ ํ์ฌ ๊ฐ์ ์ถ๊ฐํ๋ค. ๋น ๋ฆฌ์คํธ์append
ํ ๊ฐ์ ๋ฐฉ๋ฌธํ๋ค๋ ์๋ฏธ๊ฐ ๋๋ค.while
๋ฌธ์ด๋ฏ๋ก ๋ฐฉ๋ฌธ ์ฒ๋ฆฌํ ๊ฐ์pop
์ํค๊ณQueue
์ ๋จ์์๋ ๊ฐ์ ์ฐจ๋ก๋๋ก ํ์ธํ๋ค.(Queue๊ฐ ์์ด์ง ๋๊น์ง)
์ดํ์ bfs์์ผ๋ก ๋์จ ๊ฐ์ len
์ผ๋ก ๋๋ ค ์ถ๋ ฅํ๋ฉด ๋ฌธ์ ์์ ์๊ตฌํ๋ 1๋ฒ ์ปดํจํฐ๋ฅผ ํตํด ์ ๋ฐ์ด๋ฌ์ค์ ๊ฑธ๋ฆฌ๊ฒ ๋๋ ์ปดํจํฐ์ ์๋ฅผ ์ถ๋ ฅํ๊ฒ ๋๋ค. ์ด๋ ์์ ์ ๊ฐ์ ์ ์ธํด์ผ ํ๋ฏ๋ก len-1
์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์.
# 1. Flag ๋ฐฉ์
from collections import deque
def bfs(graph, start): # bfs ๊ตฌํ
queue = deque([start])
visited[start] = True
while queue:
v = queue.popleft()
result.append(v) # ์์ ๊ฐ ์ถ๊ฐ
for i in graph[v]:
if not visited[i]:
queue.append(i) # ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋ ์ถ๊ฐ
visited[i] = True
C = int(input())
NC = int(input())
graph = [[] for _ in range(C+1)]
result = []
visited = [False] * (C+1)
for i in range(NC): # ์
๋ ฅ๊ฐ ๋
ธ๋ ๋ณํ
node1, node2 = map(int, input().split())
graph[node1].append(node2)
graph[node2].append(node1)
bfs(graph, 1)
print(len(result)-1)
# 2. ๋จ์ ํ์ธ(check) ๋ฐฉ์
from collections import deque
def bfs(graph, start): # bfs ๊ตฌํ
queue = deque([start])
visited.append(start) # ์์ ๊ฐ ์ถ๊ฐ
while queue:
v = queue.popleft()
for i in graph[v]:
if i not in visited:
visited.append(i)
queue.append(i) # ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋ ์ถ๊ฐ
C = int(input())
NC = int(input())
graph = [[] for _ in range(C+1)]
visited = []
for i in range(NC):
node1, node2 = map(int, input().split())
graph[node1].append(node2)
graph[node2].append(node1)
bfs(graph, 1)
print(len(visited)-1)
๋ฐ์ํ
๋๊ธ