[BOJ][⚪2][백준#01260] DFS와 BFS

작성:    

업데이트:

카테고리:

태그: , , ,

문제 출처

BAEKJOON Online Judge #1260


문제

그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.


입력

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.


출력

첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.


예제

예제 1

입력

4 5 1
1 2
1 3
1 4
2 4
3 4


출력

1 2 4 3
1 2 3 4


예제 2

입력

5 5 3
5 4
5 2
1 2
3 4
3 1


출력

3 1 2 5 4
3 1 4 2 5


예제 3

입력

1000 1 1000
999 1000


출력

1000 999
1000 999


My Sol

def dfs(i, u):
    global visited
    if i==V:
        return 1

    for v in rel[u]:
        if visited[v]: continue
        visited[v] = 1
        stack.append(v)
        if dfs(i+1, v):
            return 1
    return 0

def bfs():
    Q = []
    Q.append(S)
    f, r = -1, 0
    visited = [0]*(V+1)
    visited[S] = 1

    while f < r:
        f += 1
        u = Q[f]
        for v in rel[u]:
            if visited[v]: continue
            visited[v] = 1
            Q.append(v)
            r += 1
    return Q


V, E, S = map(int, input().split())
rel = [[] for _ in range(V+1)]
for _ in range(E):
    u, v = map(int, input().split())
    rel[u].append(v)
    rel[v].append(u)
rel = [sorted(i) for i in rel]


stack = [S]
visited = [0]*(V+1)
visited[S] = 1
dfs(0, S)
print(*stack)
print(*bfs())

dfs와 bfs를 문제의 조건에 맞게 작성하여 처리하면 되는 문제였다. 인접 리스트로 작성하였고, 작은 노드의 순서대로 처리하기 위해 인접 리스트 rel을 각각 sort하여 시작하였다.

dfs 같은 경우 기존에 stack에 넣었다 뺐다하는 작업 대신, 한 번 stack에 들어가면 빼면 안 되는 상황이므로 고려해주었고, V depth에 도달하면 1, 아니면 0을 반환하며 visited를 모두 채울 수 있도록 하였다.

bfs 같은 경우 queue 자체를 사용하기 위해 deque가 아닌 list와 indexing을 활용하여 queue를 구현하여 반환하였다.


결과

맞았습니다!!

댓글남기기