[c++] BOJ 20040 :: ์‚ฌ์ดํด ๊ฒŒ์ž„

๋ฌธ์ œ

[์‚ฌ์ดํด ๊ฒŒ์ž„ ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ]

 

20040๋ฒˆ: ์‚ฌ์ดํด ๊ฒŒ์ž„

์‚ฌ์ดํด ๊ฒŒ์ž„์€ ๋‘ ๋ช…์˜ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์ฐจ๋ก€๋Œ€๋กœ ๋Œ์•„๊ฐ€๋ฉฐ ์ง„ํ–‰ํ•˜๋Š” ๊ฒŒ์ž„์œผ๋กœ, ์„  ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ํ™€์ˆ˜ ๋ฒˆ์งธ ์ฐจ๋ก€๋ฅผ, ํ›„ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์ง์ˆ˜ ๋ฒˆ์งธ ์ฐจ๋ก€๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค. ๊ฒŒ์ž„ ์‹œ์ž‘ ์‹œ 0 ๋ถ€ํ„ฐ n − 1 ๊นŒ์ง€ ๊ณ ์œ ํ•œ

www.acmicpc.net

์‚ฌ์ดํด ๊ฒŒ์ž„์€ ๋‘ ๋ช…์˜ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์ฐจ๋ก€๋Œ€๋กœ ๋Œ์•„๊ฐ€๋ฉฐ ์ง„ํ–‰ํ•˜๋Š” ๊ฒŒ์ž„์œผ๋กœ, ์„  ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ํ™€์ˆ˜ ๋ฒˆ์งธ ์ฐจ๋ก€๋ฅผ, ํ›„ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์ง์ˆ˜ ๋ฒˆ์งธ ์ฐจ๋ก€๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค. ๊ฒŒ์ž„ ์‹œ์ž‘ ์‹œ 0 ๋ถ€ํ„ฐ n − 1 ๊นŒ์ง€ ๊ณ ์œ ํ•œ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ€์—ฌ๋œ ํ‰๋ฉด ์ƒ์˜ ์  n ๊ฐœ๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ์ด ์ค‘ ์–ด๋Š ์„ธ ์ ๋„ ์ผ์ง์„  ์œ„์— ๋†“์ด์ง€ ์•Š๋Š”๋‹ค. ๋งค ์ฐจ๋ก€ ๋งˆ๋‹ค ํ”Œ๋ ˆ์ด์–ด๋Š” ๋‘ ์ ์„ ์„ ํƒํ•ด์„œ ์ด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์„ ๋ถ„์„ ๊ธ‹๋Š”๋ฐ, ์ด์ „์— ๊ทธ๋ฆฐ ์„ ๋ถ„์„ ๋‹ค์‹œ ๊ทธ์„ ์ˆ˜๋Š” ์—†์ง€๋งŒ ์ด๋ฏธ ๊ทธ๋ฆฐ ๋‹ค๋ฅธ ์„ ๋ถ„๊ณผ ๊ต์ฐจํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ฒŒ์ž„์„ ์ง„ํ–‰ํ•˜๋‹ค๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ์‚ฌ์ดํด์„ ์™„์„ฑํ•˜๋Š” ์ˆœ๊ฐ„ ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋œ๋‹ค. ์‚ฌ์ดํด C๋Š” ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๊ทธ๋ฆฐ ์„ ๋ถ„๋“ค์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์œผ๋กœ, ๋‹ค์Œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ๋‹ค.

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

 

ํ’€์ด

๊ฒฐ๊ตญ ์‚ฌ์ดํด์ธ์ง€๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์ค‘์š”ํ•˜๋‹ค. m๋ฒˆ์˜ ์ฐจ๋ก€๋Š” ์–ด์ฐจํ”ผ ์‚ดํŽด๋ณด์•„์•ผ ํ•˜๋‹ˆ 1,000,000(10^6) ์‹œ๊ฐ„๋ณต์žก๋„์˜ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๊ฒŒ ๋˜๋Š”๋ฐ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋‚˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‚ด๋ถ€์— 10^3 ์ด์ƒ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ์œผ๋ฉด ์•ˆ๋œ๋‹ค.๋‚ด๋ถ€์—์„œ๋Š” ์‚ฌ์ดํด์ด ์กด์žฌํ•˜๋Š” ์ง€๋ฅผ ํŒ๋‹จํ•ด์•ผํ•˜๋Š”๋ฐ ๊ทธ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. (๋…ธ๋“œ์˜ ์ด ๊ฐœ์ˆ˜๋ฅผ n์ด๋ผ๊ณ  ํ•˜์ž.)

  1. dfs๋กœ ํŒ๋‹จ : edge๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค node๋ฅผ dfsํ•˜์—ฌ ๊ฐ™์€ node๊ฐ€ ๋‚˜์˜ค๋Š” ์ง€ ์ฒดํฌํ•œ๋‹ค. ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n)์ด๋‹ค.
  2. ์ง‘ํ•ฉ์œผ๋กœ ํŒ๋‹จ : edge๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ์ด์–ด์ง„ node๋“ค์„ ๊ฐ™์€ ์ง‘ํ•ฉ์— ๋„ฃ๋Š”๋‹ค(๊ตณ์ด ๋„ฃ์„ ํ•„์š”์—†์ด ๊ฐ™์€ ์ง‘ํ•ฉ์ด๋ผ๊ณ  ํ‘œ์‹œํ•œ๋‹ค). ์ด ๋•Œ, ์ด๋ฏธ node๊ฐ€ ํ•ด๋‹น ์ง‘ํ•ฉ์— ์žˆ๋Š” ์ง€ ์ฒดํฌํ•œ๋‹ค. ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n)์ด๋‹ค.
  3. union-find : ๋ถ€๋ชจ node๋ฅผ ์ €์žฅํ•ด๋‘์—ˆ๋‹ค๊ฐ€ ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ edge์˜ ๋‘ node๊ฐ€ ๊ฐ™์€ parent๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์ฒดํฌํ•œ๋‹ค. ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(lgn)์ด๋‹ค.

 

๋”ฐ๋ผ์„œ 3๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ธ union-find๋ฅผ ์ ์šฉํ•ด์•ผ n์˜ ๋ฒ”์œ„์ธ 500,000(10^5)๋ฅผ ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ฝ”๋“œ

#include <iostream>
#include <vector>
using namespace std;

vector<int> parentList;

int parent(int idx){
	if(parentList[idx] == idx){
		return idx;
	}
	return parentList[idx] = parent(parentList[idx]);
}

bool unionGroup(int c, int p){
	int parentC = parent(c);
	int parentP = parent(p);
	if(parentC == parentP){
		// ์‚ฌ์ดํด
		return false;
	}
	parentList[parentC] = parentP;
	return true;
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
	int N, M; cin >> N >> M;
	
	for(int i=0; i<N; i++){
		parentList.push_back(i);
	}
	
	int res = 0;
	for(int i=0; i<M; i++){
		int c,p; cin >> c >> p;
		if(!unionGroup(c, p)){
			res = i+1;
			break;
		}
	}
	cout << res;
}

 

๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•

'Algorithm ๋ฌธ์ œ > BOJ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[c++] BOJ 14906 :: ์Šค๋Ÿฌํ”ผ(Slurpys)  (0) 2021.11.03
[c++] BOJ 1013 :: Contact  (0) 2021.10.17
[c++] BOJ 7579 :: ์•ฑ  (0) 2021.10.10
[c++] BOJ 1501 :: ์˜์–ด ์ฝ๊ธฐ  (0) 2021.10.07
[c++] BOJ 1253 :: ์ข‹๋‹ค  (0) 2021.09.28