사용언어 : C++
문제풀이
* main함수에서 인접리스트 만들고 1에서 시작하는 dfs 돌려주기. 노드 방문할 때마다 result(답)증가
- 전역변수 설정
int computer_num; //총 컴퓨터 갯수
int pair_num; // 연결된 쌍 갯수
int network[101][101] = { 0 }; //2차원 배열로 만든 인접리스트
bool visited[100] = { false }; //해당 컴퓨터가 방문됐는지 기록 저장
int result = 0; //답
(1) main함수에서 입력값들을 이용해 리스트만들기 (network[a][b], network[b][a] 둘 다 설정해줘야 함)
cin >> computer_num;
cin >> pair_num;
for (int i = 0; i < pair_num; i++) {
int a, b;
cin >> a >> b;
network[a][b] = 1;
network[b][a] = 1;
}
(2) dfs 함수 만들기 (재귀 이용)
void dfs(int x) {
result++;
visited[x] = true;
for (int i = 1; i <= computer_num; i++) {
if (network[x][i] && !visited[i]) //i가 dfs 실행하는 조건:x와 연결돼있으면서 방문되지 않아야 함
dfs(i);
}
return;
}
전체코드
#include<iostream>
#include<vector>
using namespace std;
int computer_num;
int pair_num;
int network[101][101] = { 0 };
bool visited[100] = { false };
int result = 0;
void dfs(int x) {
result++;
visited[x] = true;
for (int i = 1; i <= computer_num; i++) {
if (network[x][i] && !visited[i])
dfs(i);
}
return;
}
int main() {
cin >> computer_num;
cin >> pair_num;
for (int i = 0; i < pair_num; i++) {
int a, b;
cin >> a >> b;
network[a][b] = 1;
network[b][a] = 1;
}
dfs(1);
cout << result - 1;
}
총평
dfs,bfs 관련 문제였는데 아직 능숙하지도 않고 서툴러서 2차원배열로 풀었다. 방법 자체는 복잡하지 않은 것 같았지만 내가 부족해서 어려웠던 문제. 다른 블로그들도 참고하면서 코드를 다듬은 것 같다. 하다보면 늘겠지..
문제 출처
https://www.acmicpc.net/problem/2606
2606번: 바이러스
첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어
www.acmicpc.net
'CodingTest > BOJ' 카테고리의 다른 글
[BOJ 1920] 백준 수 찾기 풀이 - C++ (0) | 2021.09.13 |
---|---|
[BOJ 2331] 백준 반복 수열 풀이 - C++ (0) | 2021.09.12 |
[BOJ 8958] 백준 OX퀴즈 풀이 - C++ (0) | 2021.09.10 |
[BOJ 3052] 백준 나머지 풀이 - C++ (0) | 2021.09.07 |
[BOJ 2577] 백준 숫자의 개수 풀이 - C++ (0) | 2021.09.07 |