-
백준 2606. 바이러스 (C++)IT/알고리즘 해설 2021. 5. 16. 14:02728x90SMALL
문제
신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.
예를 들어 7대의 컴퓨터가 <그림 1>과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.
어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다. 이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.
출력
1번 컴퓨터가 웜 바이러스에 걸렸을 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 첫째 줄에 출력한다.
<풀이>
이 문제는 전형적인 dfs문제로, 시작노드로부터 연결되어있는 모든 노드들을 탐색한다. 1번노드를 시작노드로 연결된 모든 노드들을 깊이우선탐색으로 찾으면 된다.
#include <iostream> #include <vector> #include <algorithm> using namespace std; //연결된 노드들을 관리하는 2차원 벡터 vector< vector<int> > adj; //노드의 방문여부를 체크하는 벡터 vector<bool> visited; //연결된 노드의 수 int answer = 0; void dfs(int here) { //dfs함수에 진입할 경우 노드를 방문한 것이므로 true로 바꿔줌 visited[here] = true; //here와 연결된 노드들 탐색 for (int i = 0; i < adj[here].size(); i++) { //-1이 아니고 방문하지 않은 노드라면 dfs함수 재귀호출, answer값 증가 int there = adj[here][i]; if (there == -1) continue; if (!visited[there]) { dfs(there); answer++; } } } int main() { int N, E; cin >> N; cin >> E; adj.assign(N, vector<int>(E, -1)); for (int i = 0; i < E; i++) { int pair1, pair2; cin >> pair1 >> pair2; adj[pair1 - 1].push_back(pair2 - 1); adj[pair2 - 1].push_back(pair1 - 1); } visited = vector<bool>(adj.size(), false); dfs(0); cout << answer; return 0; }
728x90LIST'IT > 알고리즘 해설' 카테고리의 다른 글
프로그래머스 2020 카카오 인턴 - 키패드 누르기 해설 (파이썬) (0) 2021.09.14 백준 1010. 다리 놓기 (파이썬) (2) 2021.09.12 백준 1157번. 단어공부 (파이썬) (0) 2021.07.03 백준 1012번. 유기농 배추 (C++) (0) 2021.06.02 백준 1260번. DFS와 BFS (C++) (0) 2021.05.16