※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 4195번 문제인 친구 네트워크이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/4195
4195번: 친구 네트워크
첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스의 첫째 줄에는 친구 관계의 수 F가 주어지며, 이 값은 100,000을 넘지 않는다. 다음 F개의 줄에는 친구 관계가 생긴 순서대로 주어진
www.acmicpc.net
이 문제는 입력이 주어지는 각 시점마다 연결된 친구의 수를 구해야한다는 점을 유의하면 map과 disjoint set을 이용하여 간단히 해결할 수 있다.
N가지 친구관계가 주어지면 최대 2N명의 이름이 등장할 수 있다는 점에 유의하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <map>
#include <string>
using namespace std;
map<string, int> dict;
int arr[200000];
int cnt[200000];
int findf(int x) {
if (x == arr[x]) return x;
return arr[x] = findf(arr[x]);
}
void solve() {
dict.clear();
int N; cin >> N;
for (int i = 0; i < 2 * N; i++) {
arr[i] = i;
}
for (int i = 0; i < 2 * N; i++) {
cnt[i] = 1;
}
int idx = 0;
while (N--) {
string s1, s2; cin >> s1 >> s2;
if (dict.find(s1) == dict.end()) dict.insert({ s1,idx++ });
if (dict.find(s2) == dict.end()) dict.insert({ s2,idx++ });
int x = findf(dict[s1]), y = findf(dict[s2]);
if (x != y) {
cnt[x] += cnt[y];
arr[y] = x;
}
cout << cnt[x] << '\n';
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int T; cin >> T;
while (T--) {
solve();
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 5397 // C++] 키로거 (0) | 2021.06.20 |
---|---|
[BOJ 1666 // C++] 최대 증가 직사각형 집합 (0) | 2021.06.19 |
[BOJ 20040 // C++] 사이클 게임 (0) | 2021.06.17 |
[BOJ 17131 // C++] 여우가 정보섬에 올라온 이유 (0) | 2021.06.16 |
[BOJ 1343 // C++] 폴리오미노 (0) | 2021.06.15 |