728x90
λ°˜μ‘ν˜•

λ¬Έμ œπŸ˜‚

μ˜€λŠ˜λ„ μ„œμ€€μ΄λŠ” λ„ˆλΉ„ μš°μ„  탐색(BFS) μˆ˜μ—… 쑰ꡐλ₯Ό ν•˜κ³  μžˆλ‹€. μ•„λΉ κ°€ μˆ˜μ—…ν•œ λ‚΄μš©μ„ 학생듀이 잘 μ΄ν•΄ν–ˆλŠ”μ§€ 문제λ₯Ό ν†΅ν•΄μ„œ ν™•μΈν•΄λ³΄μž.

N개의 정점과 M개의 κ°„μ„ μœΌλ‘œ κ΅¬μ„±λœ 무방ν–₯ κ·Έλž˜ν”„(undirected graph)κ°€ 주어진닀. 정점 λ²ˆν˜ΈλŠ” 1λ²ˆλΆ€ν„° N번이고 λͺ¨λ“  κ°„μ„ μ˜ κ°€μ€‘μΉ˜λŠ” 1이닀. 정점 Rμ—μ„œ μ‹œμž‘ν•˜μ—¬ λ„ˆλΉ„ μš°μ„  νƒμƒ‰μœΌλ‘œ λ…Έλ“œλ₯Ό λ°©λ¬Έν•  경우 λ…Έλ“œμ˜ λ°©λ¬Έ μˆœμ„œλ₯Ό 좜λ ₯ν•˜μž.

λ„ˆλΉ„ μš°μ„  탐색 μ˜μ‚¬ μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€. μΈμ ‘ 정점은 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ λ°©λ¬Έν•œλ‹€.

bfs(V, E, R) {  # V : 정점 집합, E : κ°„μ„  집합, R : μ‹œμž‘ 정점
    for each v ∈ V - {R}
        visited[v] <- NO;
    visited[R] <- YES;  # μ‹œμž‘ 정점 R을 λ°©λ¬Έ ν–ˆλ‹€κ³  ν‘œμ‹œν•œλ‹€.
    enqueue(Q, R);  # 큐 맨 뒀에 μ‹œμž‘ 정점 R을 μΆ”κ°€ν•œλ‹€.
    while (Q ≠ ∅) {
        u <- dequeue(Q);  # 큐 맨 μ•žμͺ½μ˜ μš”μ†Œλ₯Ό μ‚­μ œν•œλ‹€.
        for each v ∈ E(u)  # E(u) : 정점 u의 인접 정점 집합.(정점 번호λ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ λ°©λ¬Έν•œλ‹€)
            if (visited[v] = NO) then {
                visited[v] <- YES;  # 정점 vλ₯Ό λ°©λ¬Έ ν–ˆλ‹€κ³  ν‘œμ‹œν•œλ‹€.
                enqueue(Q, v);  # 큐 맨 뒀에 정점 vλ₯Ό μΆ”κ°€ν•œλ‹€.
            }
    }
}

μž…λ ₯

첫째 쀄에 μ •μ μ˜ 수 N (5 ≤ N ≤ 100,000), κ°„μ„ μ˜ 수 M (1 ≤ M ≤ 200,000), μ‹œμž‘ 정점 R (1 ≤ R ≤ N)이 μ£Όμ–΄μ§„λ‹€.

λ‹€μŒ M개 쀄에 κ°„μ„  정보 u vκ°€ 주어지며 정점 u와 정점 v의 κ°€μ€‘μΉ˜ 1인 μ–‘λ°©ν–₯ 간선을 λ‚˜νƒ€λ‚Έλ‹€. (1 ≤ u < v ≤ N, u  v) λͺ¨λ“  κ°„μ„ μ˜ (u, v) 쌍의 값은 μ„œλ‘œ λ‹€λ₯΄λ‹€.

좜λ ₯

첫째 쀄뢀터 N개의 μ€„에 μ •μˆ˜λ₯Ό ν•œ κ°œμ”© 좜λ ₯ν•œλ‹€. i번째 μ€„μ—λŠ” 정점 i의 λ°©λ¬Έ μˆœμ„œλ₯Ό 좜λ ₯ν•œλ‹€. μ‹œμž‘ μ •μ μ˜ λ°©λ¬Έ μˆœμ„œλŠ” 1이닀. μ‹œμž‘ μ •μ μ—μ„œ λ°©λ¬Έν•  수 μ—†λŠ” 경우 0을 좜λ ₯ν•œλ‹€.

 

λ‚΄ ν’€πŸ¦·

# 24444. μ•Œκ³ λ¦¬μ¦˜ μˆ˜μ—… - λ„ˆλΉ„ μš°μ„  탐색1
from collections import deque # μš”κ±° μ•ˆν•˜κ³  κ·Έλƒ₯ stack으둜 ν•˜λ©΄ μ—λŸ¬ λ‚˜μš”...
import sys  
input = sys.stdin.readline

def bfs(R, V): # V: 정점 개수, E κ°„μ„ , R : μ‹œμž‘ 정점
    global visited
    visited = [0] * (V+1)
    q = deque([R])   # deque = deque() => λΉ„μ–΄μžˆλŠ” 큐 λ§Œλ“€κΈ°
    visited[R] = 1
    order = 1   # λͺ‡λ²ˆμ§ΈμΈμ§€ μ•ŒκΈ°μœ„ν•΄μ„œ μˆœμ„œλ₯Ό 1둜 μ΄ˆκΈ°ν™”ν•΄μ£Όκ³ 
    while q:
        t = q.popleft() # pop(0)
        # num[t].sort()
        for i in num[t]:
            # for i in sorted(num[t]): #sortedλ₯Ό μ“ΈκΊΌλ©΄ μ΄λ ‡κ²Œ!!!
            if visited[i] == 0:
                q.append(i)
                order += 1 # μ°Ύμ„λ–„λ§ˆλ‹€ μˆœμ„œλ₯Ό 1μ”© 더해쀀닀
                visited[i] = order


N, M, R = map(int, input().split())
num = [[] for _ in range(N+1)]

for _ in range(M):
    v1, v2 = map(int, input().split())
    num[v1].append(v2)
    num[v2].append(v1)

for k in num:
    k.sort()

bfs(R, N)

for s in visited[1::]:
    print(s)

 

문제 ν’€λ©΄μ„œ μ–΄λ €μ› λ˜ 점...

 

1. μ‹œκ°„μ΄ˆκ³Ό => import collections import deque와 import sys둜 ν•΄κ²°!!

 

- deque와 stackκ³Ό λ‹€λ₯Έ 점듀... 

  • deque = deque() => λΉ„μ–΄ μžˆλŠ” 큐 λ§Œλ“€μ–΄μ£ΌκΈ°  (stack은 q = [])
  • popleft() => 제일 첫 κ°’ λΉΌμ£ΌκΈ° (stack은 pop(0))

 

2. μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 뽑아 μž…λ ₯받은것듀을 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ (λ‚˜λŠ” μž…λ ₯ 받은 순 κ³ λŒ€λ‘œ λ§Œλ“€μ–΄μ„œ 계속 정닡이 μ•ˆ λ‚˜μ™”λ‹€...)

  • num[t].sort()
  • for i in sorted(num[t])
  • for k in num: k.sort() .... λ“±λ“± μ—¬λŸ¬ 방법이 μžˆλ‹€(이차원 배열이라 μ‰½μ§€μ•ŠμŒ..)

 

μ°Έκ³ ν•˜λ©΄ 쒋을 κ°œλ…λ“€ ✍️

1) BFS(λ„ˆλΉ„μš°μ„ νƒμƒ‰)

κ·Έλž˜ν”„μ™€ 트리의 κ°€κΉŒμš΄ λ…Έλ“œλΆ€ν„° νƒμƒ‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜.. 큐의 자료ꡬ쑰λ₯Ό 이용

 

- λ™μž‘κ³Όμ •

  • 탐색 μ‹œμž‘ λ…Έλ“œλ₯Ό 큐에 μ‚½μž…ν•˜κ³  λ°©λ¬Έ 처리
  • νμ—μ„œ λ…Έλ“œλ₯Ό κΊΌλ‚΄ ν•΄λ‹Ή λ…Έλ“œμ˜ 인접 λ…Έλ“œ 쀑 λ°©λ¬Έν•˜μ§€ μ•Šμ€ 곳을 큐에 μ‚½μž…ν•˜κ³  방문처리
  • 큐가 μ—†μ–΄μ§ˆ λ•ŒκΉŒμ§€ 반볡!!
def bfs(s, V): # μ‹œμž‘ 정점 s, λ§ˆμ§€λ§‰ 정점 V
    # visited 생성 => 이 μˆœμ„œ κΈ°μ–΅ν•˜κΈ°!!!!!
    visited = [0] * (V + 1)
    # 큐생성
    q = []  # 이 타이밍에 q = [s] 해도 λ©λ‹ˆλ‹Ή
    # μ‹œμž‘μ  인큐
    q.append(s)
    # μ‹œμž‘μ  λ°©λ¬Έ ν‘œμ‹œ
    visited[s] = 1
    while q: # 큐에 정점이 λ‚¨μ•„μžˆμœΌλ©΄ 계속 진행... (front != rear 라고도 μ‚¬μš©κ°€λŠ₯!! κ°™μœΌλ©΄ λΉˆκ±°λ‹ˆκΉŒ
        t = q.pop(0) # 디큐, μ•žμ—μ„œ λ½‘μ•„μ•Όκ²Ÿμ₯¬
        print(t)    # λ°©λ¬Έν•œ μ •μ μ—μ„œ 할일
        # μΈμ ‘ν•œ 정점 쀑 μΈνλ˜μ§€ μ•Šμ€ 정점 wκ°€ 있으면
        for w in adj_l[t]:
            if visited[w] == 0:
                # wλ₯Ό 인큐, 인큐 λ˜μ—ˆμŒμ„ ν‘œμ‹œ
                q.append(w)
                # visited[w] = 1
                visited[w] = visited[t] + 1 #### μ΅œμ†Œκ±°λ¦¬λ₯Ό ꡬ할 λ•Œ μ’‹μ•„μš© ###
    # print(visited[1:])

 

저희 μ‹œν—˜μ΄ importλ₯Ό μ‚¬μš©ν•  수 κ°€ 없어가지ꡬ...

문제 ν’€λ•Œ dequeλ₯Ό 쓰지 μ•Šμ•„ μƒμ†Œν•œλ°μš”... 데크 μ“°λŠ” 법은 πŸ‘‡πŸ‘‡

 

from collections import deque

def bfs(start):
    global graph, visited
    
    queue = deque([start]) # μ‹œμž‘μ μ„ 큐에 λ„£μ–΄μ€λ‹ˆλ‹€
    visited[start] = True  # λ°©λ¬Έ ν‘œμ‹œλ₯Ό ν•΄μ€λ‹ˆλ‹€
    
    while queue: # 큐에 λ‚¨μ•„μžˆλŠ” 값이 없을 λ–„κΉŒμ§€ 반볡!!
        v = queue.popleft() # 큐의 첫번째 값을 λΉΌμ˜΅λ‹ˆλ‹€
        print(v, end = '') # μ–΄λ–€ 경둜둜 λ°©λ¬Έν–ˆλŠ”μ§€ μ μ–΄μ€λ‹ˆλ‹€
        
        for i in graph[v]:  # v에 μΈμ ‘ν•œ 곳을 λŒλ©΄μ„œ
            if not visited[i]: # λ°©λ¬Έν•˜μ§€ μ•Šμ•˜λ‹€λ©΄
                queue.append(i) # 큐에 λ„£μ–΄μ£Όκ³ 
                visited[i] = True # λ°©λ¬Έ ν‘œμ‹œλ₯Ό ν•΄μ€λ‹ˆλ‹€

bfs(1) # 1은 κ·Έλƒ₯ μ‹œμž‘μ  예λ₯Ό 1둜 λ“ κ±°..
728x90
λ°˜μ‘ν˜•

+ Recent posts