[백준/C++] 11724번 연결 요소의 개수
2021. 2. 25. 22:42ㆍ알고리즘/BFS DFS
728x90
반응형
문제: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
문제풀이
BFS/DFS를 이용하여 풀었다.
그래프의 연결 요소 즉, 서로 연결되지 않은 그래프들의 수를 구하는 문제이다.
연결 요소의 수를 구하는 방법으로 방문하지 않은 노드를 만나면 1을 카운트하고 해당 노드의 탐색을 진행했다.
코드
#include <iostream>
#include <queue>
using namespace std;
int N, M;
int visited[1001] = {0,}; //방문 여부
int link[1001][1001] = {0,}; //양방향 링크
void dfs(int n){ //깊이우선탐색
visited[n] = 1;
for(int i=1; i<=N; i++){
if(link[n][i] == 1 && !visited[i])
dfs(i);
}
}
void bfs(int n){ //너비우선탐색
queue<int> q;
q.push(n);
while(!q.empty()){
n = q.front();
q.pop();
for(int i=1; i<=N; i++){
if(link[n][i] == 1 && !visited[i]){
visited[i] = 1;
q.push(i);
}
}
}
}
int main(){
ios::sync_with_stdio(false); cin.tie(nullptr);
cin>>N>>M;
for(int i=0; i<M; i++){
int s, e;
cin>>s>>e;
link[s][e] = 1; //양방항 간선이므로 s->e 와 e->s 모두 1로 저장
link[e][s] = 1;
}
int cnt = 0; //연결요소 수
for(int i=1; i<=N; i++){
if(!visited[i]){ //방문하지 않은 노드라면
cnt++; //카운트하고
bfs(i); //탐색
}
}
cout<<cnt;
return 0;
}
결과

728x90
반응형
'알고리즘 > BFS DFS' 카테고리의 다른 글
[백준/C++] 4179번 불! (0) | 2021.03.26 |
---|---|
[백준/C++] 1697번 숨바꼭질 (0) | 2021.03.26 |
[백준/C++] 7576번 토마토 (0) | 2021.03.25 |
[백준/C++] 2178번 미로 탐색 (0) | 2021.03.25 |
[백준/C++] 1926번 그림 (0) | 2021.03.24 |