티스토리 뷰
문제 링크 : https://www.acmicpc.net/problem/11724
11724번: 연결 요소의 개수
첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.
www.acmicpc.net
문제
방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.
출력
첫째 줄에 연결 요소의 개수를 출력한다.
풀이
방향성이 없는 그래프에서는 벡터에 양방향으로 입력받아주어 가중치 유무를 확인해주는 방법이 일반적이어서 벡터를 이용하여 구현하였다.
양방향으로 값을 입력 받아준후 DFS를 반복하여 이미 방문한 정점은 걸러주는 식으로 하여 연결돼있는 정점 끝까지 방문한 다음 끝나면 개수를 +1 해주었다.
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
#include<iostream>
#include<vector>
using namespace std;
int N ,M;
vector<int> a[1001];
int visited[1001];
void search(int n) {
int i;
visited[n] = 1;
for( i = 0 ; i < a[n].size() ; i++) {
if( visited[ a[n][i] ] == 1)
continue;
search(a[n][i]);
}
}
int main()
{
int i,j;
int ans = 0 ;
cin >> N >> M;
int x,y;
for( i = 0 ; i< M ;i++) {
cin >> x >> y;
a[x].push_back(y);
a[y].push_back(x);
}
for( i = 1 ; i<= N ;i++) {
if(visited[i] == 0 ) {
search(i);
ans++;
}
}
cout << ans;
return 0;
}
|
'백준 (BOJ) > DFS' 카테고리의 다른 글
백준)10026-적록색약 (0) | 2019.05.09 |
---|---|
백준)9446-텀 프로젝트 (0) | 2019.05.08 |
백준)2668-숫자고르기 (0) | 2019.05.08 |
백준) 9205 맥주 마시면서 걸어가기 (0) | 2019.05.04 |
백준) 1325 - 효율적인 해킹 (0) | 2019.05.03 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 그래프
- greedy
- 백트레킹
- 이분매칭
- 사이크
- 플로이드
- 그리디
- 다익스트라
- BFS
- 라이즈오브킹덤즈
- 사이클
- CSS
- php
- 백트래킹
- stri
- 그리디알고리즘
- HTML
- dfs
- 이분 매칭
- A
- KVK4
- #스페인어 #스페인어인강 #스페인어공부 #시원스쿨스페인어
- 라오킹전사
- 정렬
- JavaSwing
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함