알고리즘 공부(C++)

백준 2606 바이러스 - DFS 그래프 순회

혀니리리 2022. 8. 30. 15:21
728x90

2606번: 바이러스 (acmicpc.net)

 

2606번: 바이러스

첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어

www.acmicpc.net

두 번째 DFS 문제였다..

저번 DFS와 BFS문제를 잘 이해했어야만 풀 수 있는 문제

N = int(input())
M = int(input())
graph = [[] * N for _ in range(N + 1)]
visited = [False] * (N + 1)
for i in range(M):
    a, b = map(int, input().split())
    graph[a].append(b)
    graph[b].append(a)
result = 0
def dfs(start):
    visited[start] = True
    global result
    result += 1
    for i in graph[start]:
        if not visited[i]:
            dfs(i)
            visited[start] = True
dfs(1)
print(result - 1)

사실 이 문제는 DFS와 BFS문제와 다를 것이 result += 1해주는 것밖엔 없었다. 그만큼 dfs의 기본형태를 잘 알고있다면 풀 수 있는 문제. 

우선 간선끼리 연결된 노드를 만드려면 그래프를 채우는 것이 필요하다

이 문제에 나와 있는 예제처럼

이렇게 연결된 그래프를 만드려면

  0     1    2    3      4    5      6    7

               
    V     V    
  V   V   V    
    V          
              V
  V V       V  
          V    
        V      

이런 식으로 되어야함. 그러려면 간선의 개수 M만큼 for문을 돌리면서 graph[a], graph[b]에 b,a를 append하면서 교차해서 채워줘야 하고

DFS문을 돌리면서 graph[인덱스]문을 for문으로 돌면서 방문했던 곳을 True로 바꿔주면서 아래로 탐색해나가야 한다.

이것은 정말 기본형태의 스테레오타입인 것임. 그냥 외우자.

728x90

'알고리즘 공부(C++)' 카테고리의 다른 글

백준 18870 좌표 압축 - 정렬  (0) 2022.08.31
백준 10610 30 그리디  (0) 2022.08.30
백준 1269 대칭 차집합  (0) 2022.08.29
백준 2075 N번째 큰 수 -heap  (0) 2022.08.28
백준 1715 카드 정렬하기 - 힙  (0) 2022.08.28