반응형
문제
방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.
출력
첫째 줄에 연결 요소의 개수를
예제 입력 1 예제 출력 1
6 5 2
1 2
2 5
5 1
3 4
4 6
예제 입력 2 예제 출력 2
6 8 1
1 2
2 5
5 1
3 4
4 6
5 4
2 4
2 3
풀이
처음엔 문제 내용 자체를 이해하지 못했다. 연결요소? 하다가 뒤늦게 이해하고 예시1을 그려보았다.
2차원 배열을 이용해 연결된 점부분은 모두 1로 두고 시작한다.
차례로 방문여부를 확인하면서 연결 요소만 확인하면 된다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void check_map(int ** map, int dot_num, int line_num);
void check(int **map, int dot_num, int n);
int visit[1000];
int main (void){
int dot_num, line_num;
int x, y;
int **map;
scanf("%d %d", &dot_num, &line_num);
map = (int **)calloc(dot_num,sizeof(int *));
for(int i=0; i<dot_num; i++){
map[i] = (int*) calloc(dot_num,sizeof(int));
}
for(int i=0; i<line_num; i++){
scanf("%d %d", &x, &y);
map[x-1][y-1] = 1;
map[y-1][x-1] = 1;
}
check_map(map, dot_num, line_num);
}
void check_map(int ** map, int dot_num, int line_num){
int component = 0;
for(int i=0; i<dot_num; i++){
if(visit[i] != 1){
component ++;
visit[i] = 1;
check(map, dot_num, i);
}
}
printf("%d\n", component);
}
void check(int **map, int dot_num, int n){
for(int i=0; i<dot_num; i++){
if(visit[i]!= 1 && map[n][i] == 1){
visit[i] = 1;
check(map, dot_num, i);
}
}
}
c언어로 알고리즘 문제 푸는건 별로인듯하다.ㅠㅠ c++도 공부해볼 생각중
728x90
반응형
'알고리즘 > PS - 백준' 카테고리의 다른 글
[백준 2667 - C언어] 단지번호 붙이기: BFS (0) | 2021.01.28 |
---|---|
[백준 4963 - C언어] 섬의 개수: BFS (0) | 2021.01.27 |
[백준 3184 - C언어] 양: BFS (0) | 2021.01.27 |
[백준 16236 - C언어] 아기 상어: BFS (0) | 2021.01.27 |
[백준 2589 - C언어] 보물섬: BFS (0) | 2021.01.26 |