Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- C++
- koitp
- 완전탐색
- 맛집
- 잠실
- 스택
- 해커랭크
- Algorithm
- 브루트포스
- 다이나믹 프로그래밍
- 백트래킹
- dynamic programming
- 에라토스테네스의 체
- 삼성 SDS 대학생 알고리즘 특강
- 동적 계획법
- PS
- 시뮬레이션
- BOJ
- 삼성 기출
- DP
- SWEA
- sw expert academy
- 알고리즘
- 구현
- hackerrank
- BFS
- 백준
- dfs
- 그리디
- 소수
Archives
- Today
- Total
펭로그
[C++] 백준 BOJ 11724 연결 요소의 개수 본문
문제 링크 : https://boj.kr/11724
문제의 컨셉은 간단하다.
주어진 그래프에서 하나로 이어져 있는 연결 요소의 개수를 찾는 문제로 위 그림에서 하나로 이어져있는 연결 요소 수는 2개가 된다.
입력의 경우는 미리 인접 리스트를 만들어 간선을 입력 받는다.
그 이후 1부터 N까지 DFS를 돌려서 DFS가 끝나는 시점에 카운트를 하나 증가시켜 주면서 다음 시작 요소로 DFS를 돌리는 식으로 반복하면 답을 구할 수 있다.
스택으로 구현한 방법이 함수를 사용하여 재귀로 돌리는 것보다 시간이 덜 걸릴 줄 알았는데 함수로 재귀 돌리는 것이 의미 없는 수치이긴 하지만 더 빨랐다.
(위 - 스택, 아래 - 재귀)
스택으로 구현한 방법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 |
// BOJ 11724 연결 요소의 개수
#include <bits/stdc++.h>
using namespace std;
vector<int> node[1001];
bool visited[1001];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
// freopen("../input.txt", "r", stdin);
int num, edge;
cin >> num >> edge;
int s, e; // 시작점, 끝점
// 가중치 없는 그래프 입력
for(int i = 1; i <= edge; i++){
cin >> s >> e;
node[s].push_back(e);
node[e].push_back(s);
}
stack<int> dfs;
int cnt = 0;
for(int i = 1; i <= num; i++) {
// 방문하지 않은 시작점 수 == 연결요소의 갯수
if(!visited[i]) {
visited[i] = true;
dfs.push(i);
cnt++;
}
while (!dfs.empty()) {
int cur = dfs.top();
dfs.pop();
for(int j = 0; j < node[cur].size(); j++){
if(!visited[node[cur][j]]){
dfs.push(node[cur][j]);
visited[node[cur][j]] = true;
}
}
}
}
cout << cnt;
return 0;
} |
cs |
재귀로 구현한 방법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 |
// BOJ 11724 연결 요소의 개수
#include <bits/stdc++.h>
using namespace std;
vector<int> node[1001];
bool visited[1001];
void dfs(int input){
if (!visited[input]) {
visited[input] = true;
for(int j = 0; j < node[input].size(); j++)
dfs(node[input][j]);
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
// freopen("../input.txt", "r", stdin);
int num, edge;
cin >> num >> edge;
int s, e; // 시작점, 끝점
// 가중치 없는 그래프 입력
for(int i = 1; i <= edge; i++){
cin >> s >> e;
node[s].push_back(e);
node[e].push_back(s);
}
int cnt = 0;
for(int i = 1; i <= num; i++) {
// 방문하지 않은 시작점 수 == 연결요소의 갯수
if(!visited[i]) {
dfs(i);
cnt++;
}
}
cout << cnt;
return 0;
} |
cs |
'Study > PS(Algorithm)' 카테고리의 다른 글
[C++] 백준 BOJ 1012 유기농 배추 (0) | 2018.08.10 |
---|---|
[C++] 백준 BOJ 10451 순열 사이클 (0) | 2018.08.10 |
[C++] 백준 BOJ 2178 미로 탐색 (0) | 2018.08.09 |
[C++] 백준 BOJ 11399 ATM (0) | 2018.08.07 |
[C++] 백준 BOJ 2309 일곱 난쟁이 (0) | 2018.08.07 |
Comments