백준

[백준 4195] 친구 네트워크 (C++)

케굴 2021. 9. 26. 17:42
#include <bits/stdc++.h>
#define FASTIO ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define INF 987654321
using namespace std;


int N, M, F;
int parent[200001];
map<string, int> m;
//현재에는 자기 자신이 root임 

//루트 노드를 찾아주는 코드
int find(int a) {
	//a가 root임
	if (parent[a] < 0) return a;
	//a가 root가 아닐때 
	return parent[a] = find(parent[a]);

}

void merge(int a, int b) {
	a = find(a);
	b = find(b);

	if (a == b)return;
	//small to large
	if (parent[a] > parent[b]) swap(a, b);
	parent[a] += parent[b];
	parent[b] = a;
}

int main() {
	FASTIO;
	int T,cnt=1,tmp, out;
	string a, b;
	cin >> T;
	for (int k = 0; k < T; k++) {
		cin >> F;
		for (int i = 0; i < 200001; i++) parent[i] = -1;
		for (int f = 0; f < F; f++) {
			cin >> a >> b;
			if (m.find(a) == m.end()) {
				m.insert({ a,cnt });
				cnt++;
			}
			if (m.find(b) == m.end()){
				m.insert({ b,cnt });
				cnt++;
			}
			merge(m.find(a)->second, m.find(b)->second);
			tmp = find(m.find(a)->second);
			out = (-1) * parent[tmp];
			cout << out << "\n";
		
		}
		m.clear();
	}
}

Union Find 로 풀리는 문제이다.

 

이름이 string으로 주어지기 때문에 map을 사용해서 풀어야 한다.

 

그리고 친구 관계 수가 100000 개가 주어지기 때문에 parent 를 100001로 설정해서 두번 틀렸다.

친구 관계수가 100000개 라는것은 친구 수는 최대 200000명이 될 수 있기 때문에 200001로 설정해야만 한다.