(백준) 1260호: DFS 및 BFS – (Python/Python)


문제

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

라인 1260: DFS 및 BFS

첫 번째 줄에는 정점의 개수 N(1≤N≤1,000), 모서리의 개수 M(1≤M≤10,000), 검색을 시작할 정점의 개수 V가 주어진다. 다음 M 라인에는 가장자리가 연결되는 두 정점의 번호가 지정됩니다. 임의의 두 정점 사이

www.acmicpc.net

DFS와 BFS로 그래프를 검색한 결과를 출력하는 프로그램을 작성하세요. 그러나 방문할 수 있는 정점이 여러 개인 경우에는 더 작은 정점 번호를 가진 정점을 먼저 방문하고 더 이상 방문할 수 있는 정점이 없으면 프로세스를 종료합니다. 정점 번호의 범위는 1에서 N까지입니다.

입력

첫 번째 줄에는 정점의 개수 N(1≤N≤1,000), 모서리의 개수 M(1≤M≤10,000), 검색을 시작할 정점의 개수 V가 주어진다. 다음 M 라인에는 가장자리가 연결되는 두 정점의 번호가 지정됩니다. 두 꼭짓점 사이에는 여러 가장자리가 있을 수 있습니다. 입력으로 주어진 에지는 양방향입니다.

인쇄

DFS 수행 결과는 첫 번째 행에 출력되고 BFS 수행 결과는 다음 행에 출력됩니다. V부터 방문한 지점이 순서대로 출력됩니다.

암호

import sys
from collections import deque
input = sys.stdin.readline

n,m,v=map(int, input().split())

graph=(() for _ in range(n+1))
for _ in range(m):
    a,b=map(int, input().split())
    graph(a).append(b)
    graph(b).append(a)

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

dfsvisited=(False)*(n+1)
bfsvisited=(False)*(n+1)

def dfs(graph, u, dfsvisited):
    dfsvisited(u)=True
    print(u, end=' ')
    for i in graph(u):
        if not dfsvisited(i):
            dfs(graph,i,dfsvisited)

def bfs(graph, u, bfsvisited):
    queue=deque((u))
    bfsvisited(u)=True
    while queue:
        v1=queue.popleft()
        print(v1, end=' ')
        for i in graph(v1):
            if not bfsvisited(i):
                queue.append(i)
                bfsvisited(i)=True

dfs(graph,v,dfsvisited)
print()
bfs(graph, v, bfsvisited)

문제 해결

기본적인 DFS 및 BFS 문제로 그 문제를 기반으로 다른 DFS/BFS 문제를 풀 수 있을 것 같습니다.