본문 바로가기
Problem Solving

[BOJ 2606] 바이러스

by Ladun 2020. 4. 7.

https://www.acmicpc.net/problem/2606

 

2606번: 바이러스

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

www.acmicpc.net


 

위 문제는 간단하게 BFS로 풀 수 있다.

 

1번 컴퓨터에서 갈 수 있는 모든 컴퓨터를 구하면, 몇 개의 컴퓨터가 바이러스에 걸리는지 알 수 있다.

 

이를 위해서

  1. 큐에 1번을 넣음
  2. 큐에서 값을 하나 꺼냄
  3. 꺼낸 값과 연결된 모든 값 중 방문하지 않은 곳을 큐에 넣음
  4. 큐에 넣을 때마다 바이러스가 걸린 컴퓨터 개수를 추가함
  5. 큐가 빌 때까지 2 ~ 4를 반복함

#include <stdio.h>
#include <vector>
#include <queue>

using namespace std;

int n, m;

vector<vector<int>> v;
int a[101];

int main()
{
	scanf("%d%d", &n, &m);
	v.resize(n + 1);
	for(int i = 0; i < m ;i++)
	{
		int a, b;
		scanf("%d%d", &a, &b);
		v[a].push_back(b);
		v[b].push_back(a);
	}
	queue<int> q;
	q.push(1);
	a[1] = 1;

	int cnt = 0;
	while (!q.empty())
	{
		int p = q.front(); q.pop();

		for (auto s = v[p].begin(); s != v[p].end(); s++)
		{
			if (!a[*s])
			{
				a[*s] = 1;
				q.push(*s);
				cnt++;
			}
		}
	}
	printf("%d", cnt);
}

'Problem Solving' 카테고리의 다른 글

[BOJ 11053] 가장 긴 증가하는 부분 수열  (0) 2020.04.07
[BOJ 9465] 스티커  (0) 2020.04.07
[BOJ 17144] 미세먼지 안녕!  (0) 2020.03.25
[BOJ 15685] 드래곤 커브  (0) 2020.03.25
[BOJ 14891] 톱니바퀴  (0) 2020.03.25