알고리즘/백준[baekjoon]

[baekjoon] 백준 1260 번 : DFS와 BFS (by python 파이썬)

코딩하는이씨 2022. 4. 20. 22:15
728x90
반응형

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

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

 

 

정답  code

#DFS 와 BFS
from collections import deque
import sys
input = sys.stdin.readline
def dfs(v):
    print(v, end = ' ')
    visit[v] = True
    for i in graph[v]:
        if visit[i] == False:
            dfs(i)

def bfs(n):
    visit[n] = True
    queue = deque([n])
    while queue:
        v = queue.popleft()
        print(v, end= ' ')
        for i in graph[v]:
            if not visit[i]:
                queue.append(i)
                visit[i] = True


n, m , v = map(int,input().split())
graph = [[] for _ in range(n+1)]

for i in range(m):
    v1,v2 = map(int,input().split())
    graph[v1].append(v2)
    graph[v2].append(v1)

for i in range(1, n+1):
    graph[i].sort()


visit = [False] * (n+1)
dfs(v)
print()
visit = [False] * (n+1)
bfs(v)

 

 

이번 문제는 dfs와 bfs의 기본형 문제다.

깊이 우선 탐색과 너비 우선 탐색의 기본형을 공부 해볼 수 있었다.

 

solution

1. 2차원리스트를 만들어 0부터 정점의 갯수만큼 할당

2. 입력받은 간선의 좌표를 해당 정점의 위치에 저장

3. 정점 별로 정렬

4. dfs bfs함수 실행

 

dfs (스택-> 재귀사용)

1. 입력 정점 출력

2. 출력 정점 방문표시 

3. 해당 정점의 이어져있는 정점 조사후 방문안했을시 dfs재실행

 

bfs (큐사용)

1. 입력정점 방문처리

2. 큐생성

3. 큐 존재시 fifo에 의해 삭제후 출력

3. 해당 정점에 이어진 정점에대해 방문 하지 않은 정점이 있을시 큐에 추가후 방문처리

 

728x90
반응형