2606번 : 바이러스
신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.
예를 들어 7대의 컴퓨터가 <그림 1>과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.
어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다. 이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.
출력
1번 컴퓨터가 웜 바이러스에 걸렸을 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 첫째 줄에 출력한다.
생각해 볼 점
단순하게, 그래프를 받아서 DFS 혹은 BFS를 구현한 후,
1번 컴퓨터를 제외하고 나머지 컴퓨터에 방문한 횟수를 출력하면 정답입니다.
코드
#include <iostream>
#include <queue>
using namespace std;
class graph
{
private:
int N;
int result;
bool **matrix;
bool *is_pushed;
queue<int> q;
public:
graph(int N, int E);
~graph();
void bfs();
int get_result();
};
//생성자
graph::graph(int N, int E)
{
result = -1; //1번을 통해서 감염되는 수, 즉 1번을 제외함
this->N = N;
matrix = new bool*[N];
is_pushed = new bool[N];
fill_n(is_pushed, N, false);
for(int i = 0; i < N; i++)
{
matrix[i] = new bool[N];
fill_n(matrix[i], N, false);
}
for(int i = 0; i < E; i++)
{
int s, d;
cin >> s >> d;
s--;
d--;
matrix[s][d] = true;
matrix[d][s] = true;
}
is_pushed[0] = true; //1번 컴퓨터가 push된 것을 처리함
q.push(0);
}
//소멸자
graph::~graph()
{
for(int i = 0; i < N; i++) delete[] matrix[i];
delete[] matrix;
delete[] is_pushed;
}
//BFS 알고리즘
void graph::bfs()
{
if(q.empty()) return;
result++;
int current = q.front();
q.pop();
for(int i = 0; i < N; i++)
{
if(matrix[current][i] && !is_pushed[i])
{
is_pushed[i] = true;
q.push(i);
}
}
bfs();
}
//정답을 반환
int graph::get_result() {return result;}
int main()
{
int N, E; //E = 간선 수
cin >> N >> E;
graph g(N, E);
g.bfs();
cout << g.get_result();
return 0;
}
그 외
'공부 및 정리 > 백준 코드' 카테고리의 다른 글
[C++]백준 - 2667번 문제 (0) | 2021.07.25 |
---|---|
[C++]백준 - 12015번 문제 (0) | 2021.07.25 |
[C++]백준 - 1260번 문제 (0) | 2021.07.22 |
[C++]백준 - 1300번 문제 (0) | 2021.07.22 |
[C++]백준 - 2110번 문제 (0) | 2021.07.22 |