Hello Ocean! ๐ŸŒผ

[๋ฐฑ์ค€/C++] 4195. ์นœ๊ตฌ ๋„คํŠธ์›Œํฌ ๋ณธ๋ฌธ

Algorithm

[๋ฐฑ์ค€/C++] 4195. ์นœ๊ตฌ ๋„คํŠธ์›Œํฌ

bba_dda 2021. 9. 28. 20:19
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

https://www.acmicpc.net/problem/4195

 

4195๋ฒˆ: ์นœ๊ตฌ ๋„คํŠธ์›Œํฌ

์ฒซ์งธ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฒซ์งธ ์ค„์—๋Š” ์นœ๊ตฌ ๊ด€๊ณ„์˜ ์ˆ˜ F๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ์ด ๊ฐ’์€ 100,000์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค. ๋‹ค์Œ F๊ฐœ์˜ ์ค„์—๋Š” ์นœ๊ตฌ ๊ด€๊ณ„๊ฐ€ ์ƒ๊ธด ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„

www.acmicpc.net

๋ฏผํ˜์ด๋Š” ์†Œ์…œ ๋„คํŠธ์›Œํฌ ์‚ฌ์ดํŠธ์—์„œ ์นœ๊ตฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜๋Š” ์นœ๊ตฌ์ด๋‹ค. ์šฐํ‘œ๋ฅผ ๋ชจ์œผ๋Š” ์ทจ๋ฏธ๊ฐ€ ์žˆ๋“ฏ์ด, ๋ฏผํ˜์ด๋Š” ์†Œ์…œ ๋„คํŠธ์›Œํฌ ์‚ฌ์ดํŠธ์—์„œ ์นœ๊ตฌ๋ฅผ ๋ชจ์œผ๋Š” ๊ฒƒ์ด ์ทจ๋ฏธ์ด๋‹ค.

์–ด๋–ค ์‚ฌ์ดํŠธ์˜ ์นœ๊ตฌ ๊ด€๊ณ„๊ฐ€ ์ƒ๊ธด ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋‘ ์‚ฌ๋žŒ์˜ ์นœ๊ตฌ ๋„คํŠธ์›Œํฌ์— ๋ช‡ ๋ช…์ด ์žˆ๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์นœ๊ตฌ ๋„คํŠธ์›Œํฌ๋ž€ ์นœ๊ตฌ ๊ด€๊ณ„๋งŒ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ด๋ฅผ ๋งํ•œ๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฒซ์งธ ์ค„์—๋Š” ์นœ๊ตฌ ๊ด€๊ณ„์˜ ์ˆ˜ F๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ์ด ๊ฐ’์€ 100,000์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค. ๋‹ค์Œ F๊ฐœ์˜ ์ค„์—๋Š” ์นœ๊ตฌ ๊ด€๊ณ„๊ฐ€ ์ƒ๊ธด ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ์นœ๊ตฌ ๊ด€๊ณ„๋Š” ๋‘ ์‚ฌ์šฉ์ž์˜ ์•„์ด๋””๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž ๋˜๋Š” ์†Œ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๊ธธ์ด 20 ์ดํ•˜์˜ ๋ฌธ์ž์—ด์ด๋‹ค.

์ถœ๋ ฅ

์นœ๊ตฌ ๊ด€๊ณ„๊ฐ€ ์ƒ๊ธธ ๋•Œ๋งˆ๋‹ค, ๋‘ ์‚ฌ๋žŒ์˜ ์นœ๊ตฌ ๋„คํŠธ์›Œํฌ์— ๋ช‡ ๋ช…์ด ์žˆ๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์˜ˆ์ œ ์ž…๋ ฅ

2

3

Fred Barney

Barney Betty

Betty Wilma

3

Fred Barney

Betty Wilma

Barney Betty

์˜ˆ์ œ ์ถœ๋ ฅ

2

3

4

2

2

4

 

ํ’€์ด

Union- Find ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด์šฉ 

๋ฌธ์ œ์—์„œ ์›ํ•˜๋Š” ๊ฒƒ์ด ๋„คํŠธ์›Œํฌ์˜ ํฌ๊ธฐ ์ด๊ธฐ ๋•Œ๋ฌธ์—, parent๋ฐฐ์—ด ์ด์™ธ์— sizes๋ฐฐ์—ด๋„ ์ด์šฉํ•˜์˜€๋‹ค.

 

๋‘ ์นœ๊ตฌ์˜ ์ด๋ฆ„์„ ์ž…๋ ฅ๋ฐ›์€ ๋’ค, 

์ตœ์ดˆ input์ด๋ฉด ์ดˆ๊ธฐํ™”๋ฅผ ํ•ด์ฃผ๊ณ ,

๋‘ ์นœ๊ตฌ๋ฅผ Unionํ•ด์ค€๋‹ค. 

 

๊ทธ ๋’ค์— ๊ฐ๊ฐ ๋‘ ์นœ๊ตฌ์˜ ๋ถ€๋ชจ๋ฅผ Findํ•˜๊ณ , p1๊ณผ p2์˜ size๋ฅผ ๋น„๊ตํ•ด์„œ ๋” ํฐ ์ˆซ์ž๋ฅผ printํ•œ๋‹ค. 

์ฝ”๋“œ

#include <iostream>
#include <string>
#include <unordered_map>

#define endl '\n'
using  namespace std;

unordered_map<string, string> parent; // <์ด๋ฆ„, ๋ถ€๋ชจ ์ด๋ฆ„>
unordered_map<string, int> sizes; // <์ด๋ฆ„, ํฌ๊ธฐ>

// ์œ ๋‹ˆ์˜จ-ํŒŒ์ธ๋“œ
string Finds(string f1) {
	if (parent[f1] == f1) return f1;
	return parent[f1] = Finds(parent[f1]);
}
void Union(string f1, string f2) {
	f1 = Finds(f1);
	f2 = Finds(f2);

	if (f1 != f2) {
		if (sizes[f1] < sizes[f2]) {
			sizes[f2] += sizes[f1];
			parent[f1] = f2;
		}
		else {
			sizes[f1] += sizes[f2];
			parent[f2] = f1;
		}
	}
}
int main() {
	ios::sync_with_stdio(0);
	cin.tie(NULL);
	int T; cin >> T;
	for (int t = 0;t < T;t++) {
		int F; cin >> F;
		parent.clear();
		sizes.clear();
		for (int f = 0;f < F;f++) {
			string f1, f2; cin >> f1 >> f2;
			if (parent.count(f1) == 0) { // ์ตœ์ดˆ์ž…๋ ฅ์‹œ
				parent[f1] = f1;
				sizes[f1] = 1;
			}
			if (parent.count(f2) == 0) { // ์ตœ์ดˆ์ž…๋ ฅ์‹œ
				parent[f2] = f2;
				sizes[f2] = 1;
			}
			Union(f1, f2); // ๋‘ ์นœ๊ตฌ ์—ฐ๊ฒฐ
			
			string p1 = Finds(parent[f1]);
			string p2 = Finds(parent[f2]);

			int result = (sizes[p1] > sizes[p2]) ? sizes[p1] : sizes[p2];
			cout << result << endl;
		}
	}
	return 0;
}

๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•