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
'coding > algorithm' 카테고리의 다른 글
| [SW Expert Academy] D2 1954. 달팽이 숫자 (0) | 2022.05.24 |
|---|---|
| [SW Expert Academy] D3 1208. Flatten (0) | 2022.05.23 |
| [SW Expert Academy] D3 1244. 최대 상금 (0) | 2022.05.23 |
| [백준/baekjoon] Silver4 1388. 바닥 장식 (0) | 2022.05.22 |
| [SW Expert Academy] D1 2071. 평균값 구하기(c++) (0) | 2022.05.20 |
댓글