[๋ฐฑ์ค€] 13306๋ฒˆ: ํŠธ๋ฆฌ

2021. 1. 12. 16:39ใ†๐Ÿ‘จ๐Ÿป‍๐Ÿซ ํ”„๋กœ๊ทธ๋ž˜๋ฐ/BOJ(๋ฐฑ์ค€)

 


๋ฌธ์ œ๋งํฌ: [๋ฐฑ์ค€] 13306๋ฒˆ ํŠธ๋ฆฌ

 

13306๋ฒˆ: ํŠธ๋ฆฌ

ํ‘œ์ค€ ์ž…๋ ฅ์œผ๋กœ ๋‹ค์Œ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ํŠธ๋ฆฌ์˜ ์ •์ ์˜ ๊ฐœ์ˆ˜์™€ ์งˆ์˜์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ์ •์ˆ˜ N๊ณผ Q (1 ≤ N, Q ≤ 200,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N-1๊ฐœ์˜ ์ค„์˜ i๋ฒˆ์งธ ์ค„์—๋Š” ์ •์  i+1์˜ ๋ถ€

www.acmicpc.net

1. ๋ฌธ์ œ ์š”์•ฝ

ํŠธ๋ฆฌ๊ตฌ์กฐ์—์„œ ๋ถ€๋ชจ์ •์ ์— ๋Œ€ํ•œ ์ •๋ณด์™€ ์—ฐ๊ฒฐ๊ฒฝ๋กœ๋ฅผ ๋ฌป๋Š” ๋ฌธ์ œ์ธ๋ฐ์š”. ์ง‘ํ•ฉ์˜ ๋Œ€ํ‘œ์š”์†Œ์™€ ๋ถ€๋ชจ์ •์  ๋น„์Šทํ•œ ๋ง ๊ฐ™์ง€์•Š๋‚˜์š”? ์ €๋ฒˆ ์ž๋ฃŒ๊ตฌ์กฐ ํฌ์ŠคํŒ…์—์„œ ๋‹ค๋ค˜๋˜ ๋””์Šค์กฐ์ธํŠธ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ ์—ฐ์‚ฐ์„ ์ด์šฉํ•˜์—ฌ ํ‘ธ๋Š” ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. 

N๊ฐœ์˜ ์ •์ ์ด ์ˆซ์ž 1๋ถ€ํ„ฐ N๊นŒ์ง€๋กœ ํ‘œํ˜„๋˜๊ณ  ๋ฃจํŠธ๋Š” ํ•ญ์ƒ 1์ž…๋‹ˆ๋‹ค. ํŠธ๋ฆฌ์˜ ์ •์  ๊ฐœ์ˆ˜ N, ์งˆ์˜์˜ ๊ฐœ์ˆ˜ Q๊ฐ€ ์ฃผ์–ด์ง€๊ณ  2๋ฒˆ์ •์  ๋ถ€ํ„ฐ N๋ฒˆ ์ •์ ๊นŒ์ง€ ๋ถ€๋ชจ์ •์ ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ a๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  (N-1)+Q ์ค„ ์—์„œ ๋‘ ๊ฐ€์ง€ ํ˜•ํƒœ์˜ ์ž…๋ ฅ์ด ์ฃผ์–ด์ง€๋Š”๋ฐ ์ฒซ ๋ฒˆ์งธ๋Š” ๊ฒฝ๋กœ์‚ญ์ œ์ด๊ณ  ๋‘ ๋ฒˆ์งธ๋Š” ๋‘ ์ •์ ๊ฐ„์— ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ๋ฌป๋Š” ์งˆ์˜์ž…๋‹ˆ๋‹ค.


2. ๋ฌธ์ œ ํ’€์ด ๋ฐ ์ฝ”๋“œ

์ถœ๋ ฅ๋ถ€๋ฅผ ๋ณด๋ฉด ์งˆ์˜์— ๋Œ€ํ•œ ๋‹ต์„ ์ˆœ์„œ๋Œ€๋กœ Q๊ฐœ์˜ ์ค„์— YES or No ๋กœ์ถœ๋ ฅํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— N-1+Q ์ค„ ๊ฐ„์— ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์ž…๋ ฅ์„ ์Šคํƒ๊ตฌ์กฐ์— ์ˆœ์ฐจ์ ์œผ๋กœ ์ €์žฅํ•˜๋ฉด์„œ ๊ฒฝ๋กœ๋ฅผ ์‚ญ์ œํ•˜๋Š” ์ž…๋ ฅ์ธ ๊ฒฝ์šฐ์—  ๋ฏธ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ณผ์ •์ด ๋๋‚˜๋ฉด ์Šคํƒ์—์„œ ๋งˆ์ง€๋ง‰ ์งˆ์˜์— ๋Œ€ํ•œ ๋‹ต๋ถ€ํ„ฐ Find ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๋Œ€ํ‘œ์š”์†Œ๋ฅผ ํ™•์ธํ•˜๊ณ (์—ฐ๊ฒฐ ์—ฌ๋ถ€ ํ™•์ธ) ๋‹ต์„ ans ์Šคํƒ์— ์ง‘์–ด ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ญ์ œ ์ž…๋ ฅ์ด ๋“ค์–ด์™”๋˜ ์ฐจ๋ก€๊ฐ€ ์˜ค๋ฉด ๋ถ€๋ชจ์™€ ์ž์‹๋…ธ๋“œ๋ฅผ Union ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๋‹ค์‹œ ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ans ์Šคํƒ์„ ์ถœ๋ ฅํ•จ์œผ๋กœ์„œ ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,pair<int,int>> ipii;
const int MAX = 200000 + 1;
int N,Q,par[MAX];
stack<ipii> qList;
stack<string> ans;

// Find ์—ฐ์‚ฐ
int doFind(int x){				
	if(x==par[x]) return x;
	return par[x]=doFind(par[x]);
}

// Union ์—ฐ์‚ฐ
void doUnion(int a, int b){			
	a=doFind(a);
	b=doFind(b);
	if(a==b) return;
	par[a]=b;
}


int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cin>>N>>Q;
	for(int i=1;i<=N-1;i++){
		int parNode;
		cin>>parNode;
		par[i+1]=parNode;
	}
	int cnt=N-1+Q;
	while(cnt--){
		int x,b,c,d;
		cin>>x;
		if(!x) {
			cin>>b;
            
            	// ๊ฒฝ๋กœ ์‚ญ์ œ: first: 0 second: {์ž์‹,๋ถ€๋ชจ}
			qList.push({0,{b,par[b]}});	
            
            	// ๊ฒฝ๋กœ ์‚ญ์ œ: ๋ถ€๋ชจ == ์ž๊ธฐ ์ž์‹ 
			par[b]=b;		   	
		}
		else{
			cin>>c>>d;
            
            	// ์งˆ์˜ first: 1 second: {c,d}
			qList.push({1,{c,d}});		
		}
	}
	while(!qList.empty()){
    
    		// ์งˆ์˜
		if(qList.top().first){			
			int c=qList.top().second.first;
			int d=qList.top().second.second;
            
            	// Find์—ฐ์‚ฐ๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ ํ™•์ธ
			if(doFind(c)==doFind(d)) ans.push("YES");	
			else ans.push("NO");
		}
        
       		// ๊ฒฝ๋กœ ์‚ญ์ œ: Union์—ฐ์‚ฐ์„ ํ†ตํ•ด ๋‹ค์‹œ ์—ฐ๊ฒฐ
		else{							
			int par=qList.top().second.second;	
			int child=qList.top().second.first;
			doUnion(child,par);
		}
		qList.pop();
	}

	while(!ans.empty()){
		cout<<ans.top()<<"\n";
		ans.pop();
	}
	return 0;
}


3. ๋งˆ๋ฌด๋ฆฌ

๋” ์ข‹์€ ํ’€์ด๋‚˜ ๋ถ€์กฑํ•œ ๋ถ€๋ถ„ ์–ธ์ œ๋“ ์ง€ ์ง€์ ๊ณผ ์กฐ์–ธ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!