‡ CODING TEST STUDY ‡/º 백준

[백준 2606번 C++] 바이러스

Trudy | 송연 2023. 11. 12. 01:09

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

 

2606번: 바이러스

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

www.acmicpc.net


이해하기

탐색 문제는 문제를 읽으면 탐색으로 풀어야하는지 다른 유형의 문제들보다 티가 나는 거 같다. 

또, 엄청난 응용이 있다기 보다는 DFS나 BFS를 어떤 구현방법(인접 행렬, 인접 리스트)을 적절히 사용하는 지가 포인트가 되는 것 같다. 

 

탐색에서 체크해야할 부분은 가장 처음 방향 그래프, 무방향 그래를 구분해야한다. 

이번 문제에서는 무방향 그래프로, 1번 노드가 속한 사이클에 총 몇 개의 노드가 있는지 구해야했다.


최종코드

#include <iostream>
#include <vector>
using namespace std;

vector<int> v[101];
int visited[101]={0,};
int count = 0; 

void dfs(int n){
	//dfs가 호출되는 총 개수를 count (1번 노드로부터 이어지는 노드들의 개수)
    count++;
    visited[n] = 1;
    
    for(int i=0; i<v[n].size(); i++) {
        int x = v[n][i];
        if(visited[x] == 0) dfs(x);
    }
}

int main()
{
    int n, m;
    cin >> n >> m;
    
    int a, b;
    for(int i=0; i<m; i++){
        cin >> a >> b;
        v[a].push_back(b);
        //무방향 그래프이므로 두번 저장
        v[b].push_back(a);
    }
    
    //1번 노드에서 이어지는 노드들만 탐색
    dfs(1);
    
    cout << count-1 << "\n";
    return 0;
}