본문 바로가기

algorithm/BOJ

백준 2606_바이러스(C++)

 

www.acmicpc.net/problem/2606

 

2606번: 바이러스

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

www.acmicpc.net

[문제 풀이]

DFS를 이용하여 문제를 풀었습니다.

 

이 문제는 전형적이 DFS 문제로 1과 직/간접적으로 연결된 컴퓨터의 개수를 찾는 문제입니다. 1과 연결 된 i의 컴퓨터를 찾고 i와 연결 된 j의 컴퓨터를 찾는 식의 문제로 해결할 수 있습니다. 

 

코드 설명

  • 컴퓨터들의 연결을 2차원 배열에 나타냅니다.
  • 1부터 n까지 반복하며 1과 연결 된 컴퓨터 i를 찾습니다.
  • 1과 연결된 컴퓨터 i가 확인하지 않은 컴퓨터라면 i와 연결 된 컴퓨터들을 찾는 식으로 구현하였습니다.

[코드]

#include<iostream>
#include<vector>

using namespace std;

int n, m;

int map[101][101];
int visit[101];

vector<pair<int, int>> network;

void search(int idx) {

	for (int i = 1; i <= n; i++) {

		if (map[idx][i] == 1 && visit[i] == 0) {
			visit[i] = 1;
			search(i);
		}

	}

}

int main() {


	cin >> n >> m;

	for (int i = 0; i < m; i++) {
		int temp1, temp2;
		cin >> temp1 >> temp2;
		
		map[temp1][temp2] = 1;
		map[temp2][temp1] = 1;
	}

	visit[1] = 1;

	for (int i = 1; i <= n; i++) {

		if (map[1][i] == 1 && visit[i] == 0) {
			visit[i] = 1;
			search(i);
		}
	}

	int answer = 0;

	for (int i = 1; i <= n; i++)
		if (visit[i] == 1)
			answer++;

	cout << answer - 1<< endl;

	return 0;
}

 

 

'algorithm > BOJ' 카테고리의 다른 글

백준 2644_촌수계산(C++)  (0) 2020.10.26
백준 2667_단지번호붙이기(C++)  (0) 2020.10.26
백준 2178_미로 탐색(C++)  (0) 2020.10.25
백준 6603_로또(C++)  (0) 2020.10.23
백준 16395_파스칼의 삼각형(C++)  (0) 2020.10.23