티스토리 뷰
안녕하세요, 감자코딩의 감자입니다.
이번시간에 살펴볼 문제는 백준 알고리즘의 11724번 문제인데요. 이 문제는 그래프의 연결요소를 찾아보는 문제입니다.
♣ 1. 문제
연결 요소의 개수 성공
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
3 초 | 256 MB | 15569 | 7734 | 5108 | 47.318% |
문제
방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.
출력
첫째 줄에 연결 요소의 개수를 출력한다.
예제 입력 1
6 5
1 2
2 5
5 1
3 4
4 6
예제 출력 1
2
예제 입력 2
6 8
1 2
2 5
5 1
3 4
4 6
5 4
2 4
2 3
이번 문제는 바로, 그래프에 연결된 연결의 요소를 찾아내는 문제입니다. 과연 몇개의 간선(Edge)이 정점(Vertex)에 연결이 되어있는것일까요?
♣ 2. 문제 해결
1) 첫번째로 알아보셔야 할 조건은 정점의 개수와 간선의 개수 n,m을 입력을 받는것입니다. 하나의 정점에 몇개의 간선이 연결되어있는지를 알아보아야하는데요.
이때, 아! 하고 떠오르셨어야합니다.
바로 그래프 탐색 대표적인 탐색 방법인 DFS, BFS를 떠올리셔야합니다.
- Stack이용해서 갈 수 있는 만큼 최대 -> 갈수 없으면 이전 정점으로 돌아감.
- 큐를 이용 -> 갈 수 있는 정점 모두 Queue -> insert
- 중요 ! 먼저 넣고 -> Queue pop() !
♣ 3. 소스코드
//
// 연결요소찾기(11724).cpp
// beakjoon_algorithm
//
// Created by kgh on 11/04/2019.
// Copyright © 2019 kgh. All rights reserved.
//
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
vector<int> map[1001];
bool check[1001];
void dfs(int v){
check[v] = true;
for(int i=0; i<map[v].size(); i++){
int next = map[v][i];
if(check[next]==false){
dfs(next);
}
}
}
int main(void){
int n,m;
cin >> n >> m;
// 간선의 길이 만큼 정점 u, 정점 v
for(int i=0; i< m; i++){
int u,v;
cin >> u >> v;
map[u].push_back(v);
map[v].push_back(u);
}
int cnt=0;
for(int i=1; i<=n; i++){
/*
간선의 개수를 구하기 위해서는 dfs호출시에 check==false일경우 간선의 개수가 하나씩증가하는것을 알 수 있다
단, dfs함수 안에서 if(check[next]==false) dfs(next);를 처리하면 값이 정확하게 반환이 안될 수 있음.
*/
if(check[i] == false){
dfs(i); //값 체크
cnt++;
}
}
cout << cnt;
}
저는 간단하게 DFS를 사용하여 문제를 풀이를 완료하였고, 가장 중요한 부분이라고 생각하는것은
if(check[i] == false){
dfs(i); //값 체크
cnt++;
}
이 부분이였습니다. 체크 배열 변수로 방문하지 않은 곳이였을때 카운팅 값을 올려주면서 재귀호출을 진행한다면 결국 최종 갈수있는 정점까지의 탐색이 완료되고, 결국엔 cnt변수에 연결요소의 개수가 담길것입니다.
'Algorithm' 카테고리의 다른 글
[알고리즘] 백준 11726번 2*n 타일링 문제 DP (1) | 2019.04.12 |
---|---|
[알고리즘] 백준 알고리즘 1463 1로만들기 DP - 시간복잡도 분석 (1) | 2019.04.12 |
[알고리즘] 백준 1707 이분 그래프 (0) | 2019.04.11 |
[알고리즘] 백준 알고리즘 1463 1로 만들기(Top-Down/Bottom-Up, 피보나치수열) C++ (0) | 2018.12.26 |
[알고리즘] 백준알고리즘 11656번 접미사 배열 (0) | 2018.12.22 |
- Total
- Today
- Yesterday
- BFS
- MVC
- 감자개발자
- 감자코딩
- db
- C언어
- 코드엔진
- TensorFlow
- Android
- 텐서플로우
- Controller
- 개발하는 관광이
- 학교
- 스프링
- 복습
- node.js
- 프로그래밍
- 노드
- 안드로이드
- 백준알고리즘
- 백준
- Spring
- 리버싱
- Algorigm
- C langauge
- node
- programming
- 머신러닝
- 초보자를 위한 C언어 300제
- 알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |