본문 바로가기
coding/algorithm

[백준/baekjoon] Silver3 2606. 바이러스

by 눈부신음표 2022. 5. 23.
728x90

DFS 연습 2일차

DFS 재밌네

 

더보기
#include<iostream>
#include<vector>

using namespace std;

vector<bool> visited;
vector<vector<int>> adj;
int cnt = 0;

void dfs(int current) {
	visited[current] = true;

	for (int a : adj[current]) {
		if (visited[a]) continue;

		cnt++;
		dfs(a);
	}
}

int main() {
	int computer, connected;

	cin >> computer >> connected;
	adj = vector<vector<int>>(computer+1);
	visited = vector<bool>(computer + 1);

	int x, y;
	for (int i = 0; i < connected; i++) {
		cin >> x >> y;

		adj[x].push_back(y);
		adj[y].push_back(x);
	}

	dfs(1);

	cout << cnt;
}

문제

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

 

2606번: 바이러스

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

www.acmicpc.net

728x90

[접근]

DFS

https://jolly-note.tistory.com/62?category=993245 

 

DFS (Depth First Search, 깊이 우선 탐색)

접근 graph 또는 tree를 탐색하는 알고리즘이다. 특정 노드부터 시작하여 최대한 멀리 갈 수 있을만큼 진행한다. 바로 전 분기점까지 돌아가고 아직 방문하지 않은 다음 노드로 진행한다. (방문한

jolly-note.tistory.com


[접근1]

adj와 visited의 크기를 초기화해주고 연결된 computer들을 양측에 입력해준다.

computer 1부터 감염을 시작한다.

cin >> computer >> connected;
adj = vector<vector<int>>(computer+1);
visited = vector<bool>(computer + 1);

int x, y;
for (int i = 0; i < connected; i++) {
    cin >> x >> y;

    adj[x].push_back(y);
    adj[y].push_back(x);
}

dfs(1);

[접근2] - dfs 내부

현재 노드의 visited 상태를 true로 바꿔준다.

현재 노드의 인접 노드들을 돌면서 만약 이미 방문했다면 넘어가고 아니면 cnt 값을 증가시켜준 뒤 해당 노드로 다음 dfs를 진행한다.

void dfs(int current) {
	visited[current] = true;

	for (int a : adj[current]) {
		if (visited[a]) continue;

		cnt++;
		dfs(a);
	}
}
728x90

댓글