Link : https://www.acmicpc.net/problem/11724
소스 결과 : 2964 KB / 248 ms
출처 : BackJoon
설명
자료구조 책에서 DFS / BFS를 설명할 때 예시로 자주 들어지는 문제
방향이 없는 그래프 이기에 간선을 행렬로 저장시 간선을 양방향으로 저장
x y 가 주어진다면 xy와 yx를 둘다 등록해야 한다.
정점의 개수가 최대 1000개
인접 행렬 사용시 1,000 * 1,000 = 1,000,000개 = 400 만 Bytes ( int )
간선 행렬 사용시 m * 2 = n * (n - 1) / 2 * 2 = 1,000 * 999 = 999,000 = 399.6 만 Byte ( int )
둘다 3 MB 정도 밖에 사용하지 않고 차이도 별로 없기에 인접행렬을 사용한다.
알고리즘
1. x ,y 가 주어지면 배열의 x, y / y ,x 칸을 등록
2. 1번 행부터 시작
3. DFS 시작
4. 카운트 + 1
시작 라인이 n이 될 때까지 반복
BFS 버전 : https://girlfriend-yerin.tistory.com/14
소스코드
#include <iostream>
using namespace std;
bool adjMatrix[1000][1000];
bool check[1000];
void func(int start, int n) {
if (check[start])
return;
check[start] = true;
for (int i = 0; i < n; i++)
{
if (adjMatrix[start][i])
func(i, n);
}
}
int main()
{
int n, m, count = 0;
cin >> n >> m;
for (int i = 0; i < m; i++)
{
int x, y;
cin >> x >> y;
adjMatrix[x-1][y-1] = adjMatrix[y-1][x-1] = true;
}
for (int i = 0 ; i < n ; i++)
{
if (check[i])
continue;
func(i, n);
count++;
}
cout << count;
return 0;
}
'Algorithm > DFS' 카테고리의 다른 글
BaekJoon 5567 결혼식 (0) | 2019.01.21 |
---|---|
Baekjoon 1405 미친 로봇 (0) | 2019.01.21 |
BaekJoon 1389 케빈베이컨의 6단계 법칙 (0) | 2019.01.06 |
BaekJoon 6603 로또 (0) | 2019.01.05 |
BaekJoon 1987 알파벳 (0) | 2019.01.01 |