728x90
문제
신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.예를 들어 7대의 컴퓨터가 <그림 1>과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.
어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하인 양의 정수이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다. 이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.
출력
1번 컴퓨터가 웜 바이러스에 걸렸을 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 첫째 줄에 출력한다.
11724: 연결 요소 구하기와 유사하다. 차이점은 이 문제는 1번 컴퓨터와 연결된 노드의 개수를 구한다는 것.
[Baekjoon] 11724: 연결 요소의 개수 - graph — zerogod 코코딩딩
[Baekjoon] 11724: 연결 요소의 개수 - graph
문제방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.입력첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(
zerogod-ai-dev.tistory.com
DFS 함수만 약간 수정하면 끝난다.
#include <iostream>
#include <vector>
using namespace std;
class Graph
{
private:
int n_; // number of vertex
vector<vector<int>> adj_mat_; // adjacency matrix
public:
Graph(int n);
void setEdge(int row, int col);
int dfsMat(vector<bool> &visited, int v);
};
Graph::Graph(int n) : n_(n)
{
adj_mat_.resize(n);
for (int i = 0; i < n; i++)
adj_mat_[i].resize(n, 0);
}
void Graph::setEdge(int i, int j)
{
adj_mat_[i][j] = 1;
adj_mat_[j][i] = 1;
}
int Graph::dfsMat(vector<bool> &visited, int v)
{
visited[v] = true;
int cnt = 1;
for (int w = 0; w < n_; w++)
if (adj_mat_[v][w] == 1 && !visited[w])
{
cnt += dfsMat(visited, w);
}
return cnt;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, M;
cin >> N >> M;
Graph network(N);
vector<bool> visited(N, false);
for (int i = 0; i < M; i++)
{
int u, v;
cin >> u >> v;
network.setEdge(u - 1, v - 1);
}
int infected = network.dfsMat(visited, 0) - 1;
cout << infected;
return 0;
}
dfsMat 함수에 cnt라는 변수를 추가하고, 반환형을 int로 수정하여 cnt를 반환하도록 하였다. cnt는 방문 시 1로 정해지며, 연결된 노드를 방문할 경우 이를 cnt에 합하여 최종적으로 정점 v로부터 연결된 노드의 개수를 반환한다.
이는 연결된 모든 노드의 개수이므로, 변수 infected에 dfsMat의 반환값에 1을 빼어 전염된 컴퓨터의 수를 저장한다.
728x90
'Baekjoon' 카테고리의 다른 글
[Baekjoon] 9461: 파도반 수열 - (C3, S3) DP (0) | 2025.01.13 |
---|---|
[Baekjoon] 9375: 패션왕 신해빈 - (C3, S3) std::unordered_map (0) | 2025.01.13 |
[Baekjoon] 1463: 1로 만들기 - (C3, S3) DP (0) | 2025.01.12 |
[Baekjoon] 17219: 비밀번호 찾기 - (C3, S4) std::unordered_map (0) | 2025.01.12 |
[Baekjoon] 11047: (C3, S4) 동전 0 (0) | 2025.01.11 |