BOJ 1717: ์ง‘ํ•ฉ์˜ ํ‘œํ˜„

๋ฐฐ์› ๋˜ Union-Find๋ฅผ ๋ณต์Šตํ•˜๊ธฐ ์œ„ํ•ด ํ’€์–ด๋ดค์Šต๋‹ˆ๋‹ค.

๋™๋นˆ๋‚˜ ์œ ํŠœ๋ฒ„ ๋‹˜์ด ๊ตฌํ˜„ํ•œ ํ•จ์ˆ˜๋ฅผ ์ตœ๋Œ€ํ•œ ์ด์šฉํ•ด๋ณด๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

3๊ฐœ ํ•จ์ˆ˜(getParent, unionParent, findParent) ๋ชจ๋‘ ์ด์šฉํ•˜๊ณ  ์ธ์ž์— ๋ถ€๋ชจ ๋…ธ๋“œ ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋”๋‹ˆ ์‹œ๊ฐ„์ดˆ๊ณผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์‹œ๊ฐ„์ดˆ๊ณผ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด 1) ํ•จ์ˆ˜ ํ•˜๋‚˜๋ฅผ ์ค„์ด๊ณ  2) ์ธ์ž๋ฅผ ํ†ตํ•ด ๋ถ€๋ชจ ๋…ธ๋“œ ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•˜๋Š” ๋Œ€์‹  ์ „์—ญ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•˜๋‹ˆ ํ†ต๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค. (getParent, unionParent ์‚ฌ์šฉ)

 

์‹œ๊ฐ„ ์ดˆ๊ณผ ๋๋˜ ์ฝ”๋“œ

#include <iostream>
using namespace std;

int n, m;

int getParent(int parent[], int x) {
  if(parent[x] == x) return x;
  return parent[x] = getParent(parent, parent[x]);
}

void unionParent(int parent[], int a, int b) {
  a = getParent(parent, a);
  b = getParent(parent, b);

  if(a < b) parent[b] = a;
  else parent[a] = b;
}

int findParent(int parent[], int a, int b) {
  a = getParent(parent, a);
  b = getParent(parent, b);
  if(a==b) return 1;
  return 0;
}

int main(void) {
  int parent[1000001];
  cin >> n >> m;
  for(int i = 0; i <= n; i++) parent[i] = i;
  for(int i = 0; i < m; i++) {
    int op, a, b;
    cin >> op >> a >> b;
    if(op == 0) {
      unionParent(parent, a, b);
    } else {
      if(findParent(parent, a, b) == 1) cout << "YES\n";
      else cout << "NO\n";
    }
  }
  return 0;
}

 

 

ํ†ต๊ณผํ•œ ์ฝ”๋“œ

#include <iostream>
using namespace std;

int parent[1000001];
int n, m;

int getParent(int x) {
  if(parent[x] == x) return x;
  return parent[x] = getParent(parent[x]);
}

void unionParent(int a, int b) {
  a = getParent(a);
  b = getParent(b);

  if(a < b) parent[b] = a;
  else parent[a] = b;
}

int main(void) {
  ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
  cin >> n >> m;
  for(int i = 0; i <= n; i++) parent[i] = i;
  for(int i = 0; i < m; i++) {
    int op, a, b;
    cin >> op >> a >> b;
    if(op == 0) {
      unionParent(a, b);
    } else {
      if(getParent(a) == getParent(b)) cout << "YES\n";
      else cout << "NO\n";
    }
  }
  return 0;
}

 

 

 

Reference

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

 

1717๋ฒˆ: ์ง‘ํ•ฉ์˜ ํ‘œํ˜„

์ฒซ์งธ ์ค„์— n(1 ≤ n ≤ 1,000,000), m(1 ≤ m ≤ 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. m์€ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ์—ฐ์‚ฐ์˜ ๊ฐœ์ˆ˜์ด๋‹ค. ๋‹ค์Œ m๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ๊ฐ์˜ ์—ฐ์‚ฐ์ด ์ฃผ์–ด์ง„๋‹ค. ํ•ฉ์ง‘ํ•ฉ์€ 0 a b์˜ ํ˜•ํƒœ๋กœ ์ž…๋ ฅ์ด ์ฃผ์–ด์ง„๋‹ค. ์ด๋Š”

www.acmicpc.net