Post

백준 1260번 DFS와 BFS

백준 1260번 DFS와 BFS

DFS와 BFS를 모두 사용해서 두가지의 경우를 출력해야한다 하지만 예제 출력을 보면 이때까지 출력했던 방법과 다르게 노드의 순서에 따라 방문순서를 출력하는게 아니라 방문순서에 따라 노드번호를 출력해야한다

DFS와 BFS를 동시에 사용하기 때문에 변수를 겹치지 않게 각각 잘 설정해주어야 한다 출력 부분을 조심하면 어려운것은 없다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#n,m,v 가주어지는데 v시작점
from collections import deque
from functools import singledispatch
import sys
sys.setrecursionlimit(1000000) #RecursionError해결
input = sys.stdin.readline
#문제 출력에서 간선의 번호순서대로 내가 지나간 값을 출력하는게 아닌
#첫번째로 시작한점의 노드번호를 출력한다 노드번호가 바뀌면 안됨
#지나가지 않은곳은 출력하지 않고 지나간 곳만 출력한다

def dfs(k):
    global dfs_cnt
    dfs_ans[k] = dfs_cnt
    for i in line_list[k]:
        if dfs_ans[i]:
            continue
        dfs_cnt += 1
        dfs(i)

def list_prt(ans,n): # 출력을 문제 조건에 맞도록 변경하는 함수
    list1 = []
    prt = [0] * (n+1)
    for i in range(len(ans)): #i는 인덱스 번호가된다
        if ans[i] !=0:
            prt[ans[i]] = i
    

    for i in range(len(prt)):
        if prt[i] != 0: #인덱스 번호와 내부값을 바꿔서 저장한다
            list1.append(prt[i])
        
    print(*list1) #리스트를 출력할때 띄어쓰기 기준으로 하나씩 한줄에 모두 출력해준다
    

n,m,v = map(int,input().split())
line_list = [[] for _ in range(n+1)]
#dfs 재료
dfs_ans = [0] * (n+1)
dfs_cnt = 1
#bfs 재료
bfs_ans = [0] * (n+1)
bfs_cnt = 1
bfs_ans[v] = bfs_cnt
q = deque([v])

for _ in range(m):
    a,b = map(int,input().split())
    line_list[a].append(b)
    line_list[b].append(a)

for i in line_list:
    i.sort()

dfs(v)

while q:
    t = q.popleft()
    for i in line_list[t]:
        if bfs_ans[i]:
            continue
        bfs_cnt += 1
        bfs_ans[i] = bfs_cnt
        q.append(i)

list_prt(dfs_ans,n)
list_prt(bfs_ans,n)

 

 


리스트출력

리스트를 한줄에 출력하고 싶을때 for문을 사용해서 출력했지만 (end=’‘를 이용) *list_name을 이용하면 자동으로 처리해준다

This post is licensed under CC BY 4.0 by the author.