문제
https://www.acmicpc.net/problem/4195
걸린 시간
- 실패
풀이
C++
#include <bits/stdc++.h>
#define INF 1e9
#define all(c) c.begin(), c.end()
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
struct disjointSet{
map<string, string> parent;
map<string, int> rank, size;
void makeNode(string u){
if(parent[u] != "") return;
parent[u] = u;
rank[u] = 1;
size[u] = 1;
}
string find(string u){
if(u == parent[u]) return u;
return parent[u] = find(parent[u]);
}
void merge(string u, string v){
u = find(u); v = find(v);
if(u == v) return;
if(rank[u] > rank[v]) swap(u, v);
parent[u] = v;
if(rank[u] == rank[v]) rank[v]++;
size[u] = size[v] = size[u]+size[v];
}
int getSize(string u, string v){
u = find(u); v = find(v);
if(u == v) return size[u];
return size[u]+size[v];
}
};
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
int tc;
cin >> tc;
while(tc--){
int f;
cin >> f;
disjointSet d;
string a, b;
for(int i = 0; i < f; i++){
cin >> a >> b;
d.makeNode(a);
d.makeNode(b);
d.merge(a, b);
cout << d.getSize(a, b) << "\n";
}
}
return 0;
}
분리 집합(disjoint set); 유니온-파인드(union-find) 자료구조를 응용하여 푸는 문제이다. 입력 원소가 string 자료형이므로 hash map 을 사용하여 disjoint set 을 구현하여야 한다.
예제로 주어진 테스트 케이스 안에서만 생각하다 보니 disjoint set 의 필요성을 떠올리지 못했던 것과, disjoint set 의 find 함수 구현 과정에서 return 을 else 로 작성하는 바람에 아주 많은 시간 삽질을 했다.
'Baekjoon' 카테고리의 다른 글
Baekjoon 11066번 파일 합치기 (0) | 2020.11.22 |
---|---|
Baekjoon 1039번 교환 (0) | 2020.11.19 |
Baekjoon 1655번 가운데를 말해요 (0) | 2020.11.13 |
Baekjoon 5213번 과외맨 (0) | 2020.11.12 |
Baekjoon 1010번 다리 놓기 (0) | 2020.11.12 |
댓글