https://www.acmicpc.net/problem/4195
4195번: 친구 네트워크
첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스의 첫째 줄에는 친구 관계의 수 F가 주어지며, 이 값은 100,000을 넘지 않는다. 다음 F개의 줄에는 친구 관계가 생긴 순서대로 주어진
www.acmicpc.net
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
map<string, string> parent;
map<string, int> cnt;
string findParent(string k){
return parent[k] == k ? k : parent[k]=findParent(parent[k]);
}
void uni(string a, string b){
string fa = findParent(a);
string fb = findParent(b);
if (fa == fb) {
return;
} else {
parent[fb] = fa;
cnt[fa] += cnt[fb];
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int t;
cin >> t;
for (int test = 0; test < t; test++) {
int f;
cin >> f;
cnt.clear();
parent.clear();
//friend는 c++의 예약어: 변수 선언 시 주의
for (int fre = 0; fre < f; fre++) {
string a, b;
cin >> a >> b;
//네트워크에 해당 친구가 처음 참여했을 경우 추가
if (cnt.count(a) == 0) {
cnt.insert(make_pair(a, 1));
parent.insert(make_pair(a, a));
}
if (cnt.count(b) == 0) {
cnt.insert(make_pair(b, 1));
parent.insert(make_pair(b, b));
}
uni(a, b);
cout << cnt[findParent(a)] << "\n";
}
}
return 0;
}
disjoint set 문제이지만 정수 대신 string으로 구하는 문제이다.
map으로 <친구 이름, 네트워크의 수>, <친구 이름, 부모 이름>을 선언하고,
해당 친구가 처음 들어왔다면 두 맵에 추가를 한다. 이후 같은 친구 네트워크에 union 연산을 하고 해당 친구 네트워크의 수를 출력하면 정답을 출력할 수 있다.
* friend는 c++의 예약어 중 하나이다. 변수 선언 시 주의하자
'Coding Test' 카테고리의 다른 글
백준 1106 호텔 (0) | 2024.04.08 |
---|---|
백준 4256 트리 (1) | 2024.04.07 |
백준 21939 문제 추천 시스템 Version 1 (0) | 2024.04.05 |
백준 2346 풍선 터뜨리기 (0) | 2024.04.04 |
백준 16937 두 스티커 (2) | 2024.04.03 |