-
[4195] 친구 네트워크BOJ 2022. 3. 2. 12:25
https://www.acmicpc.net/problem/4195
4195번: 친구 네트워크
첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스의 첫째 줄에는 친구 관계의 수 F가 주어지며, 이 값은 100,000을 넘지 않는다. 다음 F개의 줄에는 친구 관계가 생긴 순서대로 주어진
www.acmicpc.net
일단 문자열을 숫자로 바꿔놓고 생각하면 두 정수형 A, B에 대해 union(A,B)를 해준다.
p[]의 값을 트리의 크기로 놓으면, abs(find(A))가 답이 된다.
#include <bits/stdc++.h>using namespace std;#ifdef ONLINE_JUDGEconstexpr bool local = false;#elseconstexpr bool local = true;#endifusing ll = long long;using pi = pair<ll, ll>;#define union _unionint n, m, p[1000005];int find(int cur) {if (p[cur] < 0) return cur;return p[cur] = find(p[cur]);}void union(int A, int B) {A = find(A), B = find(B);if (A == B) return;if (p[A] < p[B])p[A] += p[B], p[B] = A;elsep[B] += p[A], p[A] = B;}unordered_map<string, int> mp;int main(void) {if (!local) ios_base::sync_with_stdio(0), cin.tie(0);int t;cin >> t;while (t--) {memset(p, -1, sizeof(p));mp.clear();cin >> n;int i;for (i = 0; i < n; i++) {string a, b;cin >> a >> b;if (mp.count(a) == 0) mp[a] = 1 + mp.size();if (mp.count(b) == 0) mp[b] = 1 + mp.size();int A = mp[a], B = mp[b];union(A, B);A = find(A);cout << abs(p[A]) << '\n';}}return 0;}
'BOJ' 카테고리의 다른 글
[6236] 용돈 관리 (0) 2022.03.02 [2512] 예산 (0) 2022.03.02 [1976] 여행 가자 (0) 2022.03.02 [2696] 중앙값 구하기 (0) 2022.02.27 [5052] 전화번호 목록 (0) 2022.02.27