Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

3-dhlee777 #14

Merged
merged 2 commits into from
Mar 25, 2024
Merged

3-dhlee777 #14

merged 2 commits into from
Mar 25, 2024

Conversation

dhlee777
Copy link
Contributor

@dhlee777 dhlee777 commented Mar 23, 2024

πŸ”— 문제 링크

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

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

3μ‹œκ°„

✨ μˆ˜λ„ μ½”λ“œ

μœ λ‹ˆμ˜¨ νŒŒμΈλ“œ(uion-find)λž€ λŒ€ν‘œμ μΈ κ·Έλž˜ν”„ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ νŠΉμ • 두 λ…Έλ“œκ°€ 같은집합에 μ†ν•΄μžˆλŠ”μ§€ νŒλ³„ν•΄μ£ΌλŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.
크게 νŠΉμ • 두 집합을 ν•©μΉ˜λŠ” union μ—°μ‚°κ³Ό λ£¨νŠΈλ…Έλ“œλ₯Ό μ°ΎλŠ” find μ—°μ‚°μœΌλ‘œ 이루어진닀.
μš°μ„  parent 배열은 μ–΄λ–€λ…Έλ“œμ˜ λΆ€λͺ¨λ…Έλ“œλ₯Ό μ €μž₯ν•˜λŠ” λ°°μ—΄λ‘œ μ΅œμ’…μ μœΌλ‘œλŠ” μ–΄λ–€λ…Έλ“œμ˜ λ£¨νŠΈλ…Έλ“œκ°€ μ €μž₯λœλ‹€.

#include<stdio.h>
#include<iostream>
using namespace std;
int parent[1000001];          //μ–΄λ–€μˆ˜μ˜ λΆ€λͺ¨λ…Έλ“œλ₯Ό μ €μž₯ν•˜λŠ” λ°°μ—΄ ,μ΅œμ’…μ μœΌλ‘œλŠ” κ·Έ 수의 λ£¨νŠΈλ…Έλ“œκ°€ μ €μž₯λœλ‹€.
int find_parent(int a) {        //μ–΄λ–€ λ…Έλ“œμ˜ λ£¨νŠΈλ…Έλ“œλ₯Ό μ°ΎλŠ” ν•¨μˆ˜
	if (a == parent[a])  return a;
	else  return parent[a]=find_parent(parent[a]);
}
void add (int a,int b) {     
	a = find_parent(a);      //a의 루트 λ…Έλ“œλ₯Ό μ°Ύκ³ 
	b = find_parent(b);		//b의 λ£¨νŠΈλ…Έλ“œλ₯Ό μ°Ύμ•„
	if (a == b) return;     //두 수의 λ£¨νŠΈλ…Έλ“œκ°€ κ°™μœΌλ©΄ 이미 같은집합에 μžˆμœΌλ―€λ‘œ ν•¨μˆ˜ μ’…λ£Œ
	if (a < b) parent[b] = a;   //더 μž‘μ€ μˆ˜κ°€ λ£¨νŠΈκ°€ λœλ‹€.
	else parent[a] = b;
}
void compare(int a, int b) {
	a = find_parent(a);
	b = find_parent(b);
	if (a == b) cout<<"yes\n";  //λ‘μˆ˜μ˜ λ£¨νŠΈκ°€ κ°™μœΌλ©΄(같은집합) yes μ•„λ‹ˆλ©΄ no 좜λ ₯ 
	else  cout<<"no\n";
}

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	int num, calculate_num,a,b,c;
	cin >> num >> calculate_num;
	for (int j = 1; j <= num; j++) {
		parent[j] = j; //μžμ‹ μ˜ λ£¨νŠΈλŠ” μžμ‹ μ΄λ―€λ‘œ μ΄ˆκΈ°ν™”ν•΄μ€€λ‹€.
	}
	for (int i = 0; i < calculate_num; i++) {
		cin >> a >> b >> c;
		if (!a)  add(b, c);  //0일경우 합집합 μ—°μ‚°μ΄λ―€λ‘œ 두 집합을 합쳐쀀닀.
		else  compare(b, c);  //1일경우 두 μˆ˜κ°€ 같은집합에 μžˆλŠ”μ§€ 비ꡐ
		
	}
	
	return 0;
}

find_parent(int a) ν•¨μˆ˜λŠ” a의 λ£¨νŠΈλ…Έλ“œλ₯Ό μ°ΎλŠ” ν•¨μˆ˜λ‘œ μž¬κ·€ν˜ΈμΆœμ„ 톡해 a의 λ£¨νŠΈλ…Έλ“œλ₯Ό μ°Ύμ•„λ‚Έλ‹€.
add(int a, int b) ν•¨μˆ˜λŠ” a집합과 b집합을 ν•©μΉ˜λŠ” ν•¨μˆ˜λ‘œ 두 수의 λ£¨νŠΈλ…Έλ“œλ₯Ό 각각 μ°Ύμ•„ μ—°κ²°ν•΄μ€€λ‹€.
compare(int a,int b)ν•¨μˆ˜λŠ” 두 μˆ˜κ°€ 같은집합에 μ†ν•΄μžˆλŠ”μ§€ 각 λ…Έλ“œμ˜ λ£¨νŠΈλ…Έλ“œλ₯Ό 톡해 ν™•μΈν•˜λŠ” ν•¨μˆ˜μ΄λ‹€.

  1. μ΅œλŒ€λ…Έλ“œκ°’ num,와 μ—°μ‚°μ˜ 개수 calculate_num을 각각 μž…λ ₯λ°›λŠ”λ‹€.
  2. μžμ‹ μ˜ λ£¨νŠΈλŠ” μžμ‹ μ΄λ―€λ‘œ parent[j] = j을 톡해 μ΄ˆκΈ°ν™”ν•΄μ€€λ‹€.
  3. 이제 연산듀을 μ§„ν–‰ν•˜λŠ”λ° λ§Œμ•½ 0 b c 의 ν˜•νƒœμΌ 경우 ν•©μ§‘ν•©μ—°μ‚°μ΄λ―€λ‘œ add()호좜
  4. 1 b c ν˜•νƒœμΌ 경우 두 μˆ˜κ°€ 같은집합에 μžˆλŠ”μ§€ λΉ„κ΅ν•΄μ•Όν•˜λ―€λ‘œ compare()호좜

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

제일 μ²˜μŒμ— find_parent() ν•¨μˆ˜μ˜ 리턴 λΆ€λΆ„μ—μ„œreturn find_parent(parent[a]);λ₯Ό ν–ˆλ”λ‹ˆ μ‹œκ°„μ΄ˆκ³Όκ°€ 계속 났닀.
κ·Έμ˜ν›„ return parent[a]=find_parent(parent[a]); 둜 parent[a]에 κ²°κ³Όλ₯Ό μ €μž₯ν•˜λŠ” μ½”λ“œλ₯Ό μΆ”κ°€ ν–ˆλ”λ‹ˆ μ‹œκ°„μ΄ˆκ³Όλ¬Έμ œκ°€
ν•΄κ²°λ˜μ—ˆλ‹€. μ•„λ§ˆ 이과정을 톡해 parent λ°°μ—΄μ˜ 값을 λΆ€λͺ¨λ…Έλ“œ κ°’μ—μ„œ λ£¨νŠΈλ…Έλ“œμ˜ κ°’μœΌλ‘œ λ³€ν™”μ‹œμΌœμ£ΌλŠ” κ³Όμ •μ—μ„œ μ‹œκ°„μ΄ˆκ³Όκ°€ ν•΄κ²°λœ 것 κ°™λ‹€.

Copy link
Collaborator

@yuyu0830 yuyu0830 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

μΌμ’…μ˜ 트리 λ§Œλ“€κΈ°κ΅°μš”! 문제만 읽고 일일이 λ…Έλ“œ λ§Œλ“€μ–΄μ„œ ν•΄κ²°ν•˜λ‚˜? μ‹Άμ—ˆλŠ”λ° 1차원 배열에 λΆ€λͺ¨ κ°’λ§Œ μ €μž₯ν•˜λ©΄ λ¬Έμ œκ°€ μ—†λ„€μš”! μ½”λ“œκ°€ 읽기 μ‰¬μ›Œμ„œ μ’‹μ•˜μŠ΅λ‹ˆλ‹€ :)

@tgyuuAn
Copy link
Member

tgyuuAn commented Mar 23, 2024

μ½”λ“œ λΈ”λŸ­μ— ```cpp 처럼 μ–Έμ–΄ λͺ…을 λͺ…μ‹œν•΄μ£Όλ©΄ μ½”λ“œ λΈ”λŸ­ ν•˜μ΄λΌμ΄νŒ… λ©λ‹ˆλ‹€!

μ΄λ²ˆμ—” μ œκ°€ κ³ μ³λ†¨μ–΄μš”!

@dhlee777
Copy link
Contributor Author

ν—‰ κ°μ‚¬ν•©λ‹ˆλ‹€ λ‹€μŒλΆ€ν„°λŠ” μ½”λ“œλΈ”λŸ­ ν•˜μ΄λΌμ΄νŒ… 될수있게 μ €λ ‡κ²Œ ν•˜κ² μŠ΅λ‹ˆλ‹€..!

Copy link
Collaborator

@seongwon030 seongwon030 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

μœ λ‹ˆμ˜¨ νŒŒμΈλ“œλŠ” 처음 λ³΄λ„€μš”! μƒˆλ‘œμš΄ μ•Œκ³ λ¦¬μ¦˜ 잘 보고 κ°‘λ‹ˆλ‹€.

@tgyuuAn
Copy link
Member

tgyuuAn commented Mar 24, 2024

μœ λ‹ˆμ˜¨ νŒŒμΈλ“œλŠ” 처음 λ³΄λ„€μš”! μƒˆλ‘œμš΄ μ•Œκ³ λ¦¬μ¦˜ 잘 보고 κ°‘λ‹ˆλ‹€.

😠😠😠

Copy link
Collaborator

@InSange InSange left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Union findλŠ” μ—°κ²°λ˜μ–΄ μžˆλŠ” μƒλ‹¨μ˜ 곡톡 뢀뢄을 μ°Ύμ•„ λΉ„κ΅ν•œλ‹€λŠ” μ μ—μ„œ 처음 λ΄€μ—ˆμ„ λ•Œ 되게 ν—·κ°ˆλ € ν–ˆλ˜ 적이 기얡이 λ‚˜λ”κ΅°μš”..
λŒ€λΆ€λΆ„μ˜ λ¬Έμ œλŠ” visited둜 λ°©λ¬Έν–ˆλŠ”μ§€ μ•ˆν–ˆλŠ”μ§€ λΉ„κ΅λ§Œ ν•΄μ£Όλ©΄ 되던 λ¬Έμ œλ“€μ΄ 주둜 λ‚˜μ˜€λ‹€κ°€λ£¨νŠΈλ₯Ό λΉ„κ΅ν•΄μ„œ 곡톡점을 μ°ΎλŠ” 뢀뢄이 Union findλ₯Ό ν’€κ²Œλ˜λ©΄μ„œ μ‹ μ„ ν–ˆμ—ˆλ˜ 것 κ°™μŠ΅λ‹ˆλ‹€.
λ°”μ΄λŸ¬μŠ€ ν•΄λ‹Ή λ¬Έμ œμ—μ„œ μ €λŠ” visited둜 ν’€μ–΄μ€¬μ§€λ§Œ Union findλ‘œλ„ ν’€ 수 μžˆμ–΄μ„œ μž¬λ°Œμ—ˆμŠ΅λ‹ˆλ‹€. 문제 μΆ”μ²œλ“œλ¦½λ‹ˆλ‹€!
μ΄λŸ¬ν•œ νƒμƒ‰λ¬Έμ œλ“€ 쀑 heap κ΄€λ ¨ λ¬Έμ œλ“€κ³Ό λ¬Έμžμ—΄ νƒμƒ‰μ—μ„œ 트라이 λ¬Έμ œλ“€μ΄ μžˆλŠ”λ° ν•œ 번 μ•Œμ•„λ³΄μ‹œλ©΄ 좔후에 λ‚œμ΄λ„ μžˆλŠ” λ¬Έμ œλ“€μ„ ν’€μ΄ν•˜μ‹œλŠ”λ° 도움이 될 거라 μƒκ°ν•©λ‹ˆλ‹€!

@dhlee777
Copy link
Contributor Author

ν—‰..저도 λ°”μ΄λŸ¬μŠ€λ¬Έμ œλ₯Ό 푼적이 μžˆμ—ˆλŠ”λ° 이걸 μœ λ‹ˆμ˜¨νŒŒμΈλ“œ λ‘œλ„ μ ‘κ·Όν• μˆ˜ μžˆμ—ˆκ΅°μš”..? νŠΈλΌμ΄λΌλŠ” μžλ£Œκ΅¬μ‘°λ„ μžˆλŠ”μ§€ 처음 μ•Œμ•˜λ„€μš”.. κ΄€λ ¨ μžλ£Œκ΅¬μ‘°μ—λŒ€ν•΄ 더 κ³΅λΆ€ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€ !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants