반응형
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 | 31 |
Tags
- 구현
- list
- red-black tree
- c++
- 예제
- STL
- Pair
- Heap
- deletion
- qsort
- Biconnected_Component
- sstream
- singly Linked List
- Algorithm
- function_template
- sort
- 13305
- '0'
- 5397
- Articulation_Point
- 총정리
- template
- 알고리즘
- class_template
- 문법
- 자료구조
- 백준
- Critical_Path_Analysis
- connected_component
- data_structure
Archives
- Today
- Total
- Today
- Total
- 방명록
어제의 나보다 성장한 오늘의 나
[C++][집합 / 자료구조] 백준 1717번 풀이 및 설명 본문
반응형
Union - Find 알고리듬을 사용하면 쉽게 해결할 수 있는 문제이다.
다만 이 문제는 시간 초과가 발생하기 때문에 시간을 줄이기 위해 코드를 완성도 있게 짤 필요가 있다.
문제
알고리듬
① 0 a b 형태로 주어진 경우
union을 통해 집합을 합쳐 주면 된다.
② 1 a b 형태로 주어진 경우
a , b의 find 값이 같다면 YES 출력
다르다면 NO 출력
위의 과정을 모든 입력값에 대하여 시행 하면 된다.
시간 단축 방법
1) stdio 스트림 과의 동기화 취소
cin.tie(NULL);cout.tie(NULL);
ios_base::sync_with_stdio(false);
위의 코드를 추가해 주면 cin , cout이 훨씬 빠르게 돌아간다.
자세한 설명은 아래 글 참고..!
2) find 함수 수정
int Set::find(int num){
if(root[num] == num) return num;
return find(root[num]);
}
혹시 find 함수를 이렇게 사용한다면 return 부분을 아래와 같이 수정
int Set::find(int num){
if(root[num] == num) return num;
return root[num]= find(root[num]);
}
find를 할 때 root 값을 업데이트 해주기 때문에 속도가 더 빨라짐.
전체 Code
#include <iostream>
using namespace std;
class Set{
private :
int* root;
public :
Set(int n){
root = new int[n+1];
for(int i = 0 ; i < n+1 ; ++i) root[i] = i;
}
~Set(){ delete[] root; };
int find(int num);
void union_(int num1 , int num2);
void check_(int num1, int num2);
};
int Set::find(int num){
if(root[num] == num) return num;
return root[num]= find(root[num]);
}
void Set::union_(int num1 , int num2){
num1 = find(num1);
num2 = find(num2);
root[num2] = num1;
}
void Set::check_(int num1 , int num2){
if(find(num1) == find(num2)) cout << "YES\n";
else cout << "NO\n";
}
int main(int argc, char** argv){
cin.tie(NULL);cout.tie(NULL);
ios_base::sync_with_stdio(false);
int n , m , a , b , zero_or_one;
cin >> n >> m ;
Set set(n);
for(int i = 0; i < m ; ++i){
cin >> zero_or_one >> a >> b;
if(zero_or_one == 0) set.union_(a,b);
else if(zero_or_one == 1) set.check_(a,b);
}
return 0;
}
반응형
'c++ > 백준 문제 풀이' 카테고리의 다른 글
[C++][자료구조 Stack] 백준 10828번 문제 풀이 (0) | 2022.07.24 |
---|---|
[C++] 백준 5397번 풀이 (0) | 2022.07.24 |
[C++][Graph] 백준 1197번 문제 풀이 및 설명 (0) | 2022.07.01 |
[C++][코딩테스트] 시간 부족 문제 해결 꿀팁 정리( endl , ios_base::sync_with_stdio(false) , cin.tie(NULL) , cout.tie(NULL) ) (0) | 2022.07.01 |
[c++][BFS] 백준 2178번 문제 풀이 (0) | 2022.02.24 |
Comments