본문 바로가기

백준

백준2606 - 바이러스

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

 

2606번: 바이러스

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

www.acmicpc.net

어제 UCPC 참여해서 고냥 광탈해버린 뒤 마음잡고 푼 문제다. 1번 컴퓨터에서 도달할 수 있는 모든 곳을 찾았다. 일 대 다 관계이므로 다익스트라 알고리즘을 수행하면 될 것 같았다. 1번 컴퓨터와 연결이 안 된 곳은 결과 값이 0으로 남아있어서 다음과 같이 풀었다.

 

#include <iostream>
#include <string.h>
#include <queue>
using namespace std;

vector<int> v[101]; //컴퓨터 100대가 연결되어 있는 정보
int d[101]; //다익스트라 결과를 담을 공간
int cnt; //1번에 연결되어 있는 컴퓨터의 수
int n, m; //n개의 컴퓨터, m개의 연결 정보

//다익스트라 알고리즘, 시작점을 넣어주면 종착점을 큐에 넣어주고 각각의 종착점에 연결되어 있는 곳을 탐색하며 나아간다. 탐색한 곳은 pop으로 제거
void dijkstra(int start) {
	queue<int> q; //비용이 모두 같은 다익스트라 알고리즘을 수행하기 때문에 일반 큐를 이용
	q.push(start);
	while (!q.empty()) {
		int x = q.front();
		q.pop();
		for (int i = 0; i < v[x].size(); i++) {
			if (!d[v[x][i]]) { //다익스트라 결과가 적용되지 않은 곳이면
				if (v[x][i] == 1) { //1번 노드는 무시
					continue;
				}
				d[v[x][i]] = d[x] + 1; //결과를 전에 도착한 곳 + 1로 갱신
				q.push(v[x][i]); //현재 도착점을 큐에 삽입
			}
		}
	}
}

int main() {
	//컴퓨터의 갯수와 정보의 갯수를 입력
	cin >> n;
	cin >> m;

	//연결되어 있는 정보를 큐에 삽입
	for (int i = 0; i < m; i++) {
		int a, b;
		cin >> a >> b;
		v[a].push_back(b);
		v[b].push_back(a);
	}

	//1번에서 다익스트라 수행
	dijkstra(1);

	//1번에 연결되어 있으면 0이 아닐테니 cnt를 늘려준다.
	for (int i = 1; i <= n; i++) {
		if (d[i]) {
			cnt++;
		}
	}

	cout << cnt;
}

'백준' 카테고리의 다른 글

백준4889 - 안정적인 문자열  (0) 2019.07.30
백준1699 - 제곱수의 합  (0) 2019.07.28
백준15739 - 매직스퀘어  (0) 2019.07.26
백준1773 - 폭죽쇼  (0) 2019.07.26
백준4673 - 셀프 넘버  (0) 2019.07.25