Notice
Recent Posts
Recent Comments
Link
승코딩당당당
[C++] 백준 2606: 바이러스 본문
문제
[C++] 백준 2606: 바이러스 SILVER 3
https://www.acmicpc.net/problem/2606

접근 방법
백준 2606번은 컴퓨터 바이러스 문제로,
1번 컴퓨터가 바이러스에 감염되었을 때 연결된 다른 컴퓨터가 몇 대 감염되는지 구하는 문제다.
컴퓨터들이 네트워크로 연결되어 있기 때문에, 이를 그래프 탐색 문제로 볼 수 있다.
문제의 핵심은 다음과 같다.
- 컴퓨터 = 노드
- 네트워크 연결 = 간선
따라서 그래프 탐색(DFS 또는 BFS) 을 이용해서 1번 컴퓨터에서 시작하여 연결된 모든 컴퓨터를 방문하면 된다.
이번 풀이에서는 DFS(Depth First Search) 를 사용했다.
먼저 그래프를 인접 리스트 형태로 저장한다.
vector<vector<int>> graph;
그리고 방문 여부를 확인하기 위해 배열을 사용했다.
vector<bool> visited;
DFS는 다음과 같이 구현했다.
void dfs(int node)
{
visited[node] = true;
for (int i = 0; i < graph[node].size(); i++)
{
int next = graph[node][i];
if (!visited[next])
dfs(next);
}
}
1번 컴퓨터부터 DFS를 시작하면 같은 네트워크로 연결된 모든 컴퓨터가 방문된다.
마지막으로 1번 컴퓨터를 제외한 방문된 컴퓨터 수를 세면 감염된 컴퓨터 수가 된다.
구현 시 주의할 점
- 그래프는 양방향이다.
- 마지막 cnt에서 수를 갱신할 때 1번 컴퓨터는 제외하도록 2번 노드부터 for문을 돌린다.
코드
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> graph;
vector<bool> visited;
void dfs(int node)
{
visited[node] = true;
for (int i = 0; i < graph[node].size(); i++)
{
int next = graph[node][i];
if (!visited[next])
dfs(next);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n = 0, m = 0;
cin >> n >> m;
graph.resize(n + 1);
visited.resize(n + 1, false);
for (int i = 0; i < m; i++)
{
int a = 0, b = 0;
cin >> a >> b;
graph[a].push_back(b);
graph[b].push_back(a);
}
dfs(1);
int cnt = 0;
for (int i = 2; i <= n; i++)
{
if (visited[i])
cnt++;
}
cout << cnt;
}'PS > BOJ' 카테고리의 다른 글
| [C++] 백준 10826: 피보나치 수 4 (0) | 2026.03.09 |
|---|---|
| [C++] 백준 2749: 피보나치 수 3 (0) | 2026.03.08 |
| [C++] 백준 9471: 피사노 주기 (0) | 2026.03.07 |
| [C++] 백준 11725: 트리의 부모 찾기 (0) | 2026.03.03 |
| [C++] 백준 1850: 최소공약수 (0) | 2026.03.02 |