Union & Find
๐โโ๏ธUnion & Find
disjoinset ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
์๋ฅผ ๋ค์ด
์งํฉ A : {1, 2}
์งํฉ B : {2, 3}
์ด ์๋ค๊ณ ํ ๋,
2๋ผ๋ ๊ณตํต ์์๊ฐ ์์ผ๋ฏ๋ก {1, 2, 3}์ผ๋ก ํํํ๋ ๋ฐฉ์์ด๋ค.
์ด ์๊ณ ๋ฆฌ์ฆ์ ์๋์ ๋ฌธ์ ์ ํจ๊ป ์ค๋ช !
77. ์น๊ตฌ์ธ๊ฐ? (Union&Find ์๋ฃ๊ตฌ์กฐ)
์ค๋์ ์ ํ๊ธฐ ์๋ก์ด ๋ฐ์์ ์ฒ์ ์์ํ๋ ๋ ์ด๋ค.
ํ์๋ค ๋ฐ ํ์์ N๋ช
์ด๋ค.
ํ์๋ ๊ฐ ํ์๋ค์ ์น๊ตฌ๊ด๊ณ๋ฅผ ์๊ณ ์ถ๋ค.
๋ชจ๋ ํ์์ 1๋ถํฐ N๊น์ง ๋ฒํธ๊ฐ ๋ถ์ฌ๋์ด ์๊ณ , ํ์์๊ฒ๋ ๊ฐ๊ฐ ๋ ๋ช
์ ํ์์ ์น๊ตฌ ๊ด๊ณ๊ฐ ๋ฒํธ๋ก ํํ๋ ์ซ์์์ด ์ฃผ์ด์ง๋ค.
๋ง์ฝ (1, 2), (2, 3), (3, 4)์ ์ซ์์์ด ์ฃผ์ด์ง๋ฉด 1๋ฒ ํ์๊ณผ 2๋ฒ ํ์์ด ์น๊ตฌ์ด๊ณ , 2๋ฒ ํ์๊ณผ 3๋ฒ ํ์์ด ์น๊ตฌ, 3๋ฒ ํ์๊ณผ 4๋ฒ ํ์์ด ์น๊ตฌ์ด๋ค.
๊ทธ๋ฆฌ๊ณ 1๋ฒ ํ์๊ณผ 4๋ฒ ํ์์ 2๋ฒ๊ณผ 3๋ฒ์ ํตํด์ ์น๊ตฌ๊ด๊ณ๊ฐ ๋๋ค.
ํ์์ ์น๊ตฌ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ ์ซ์์์ด ์ฃผ์ด์ง๋ฉด ํน์ ๋ ๋ช
์ด ์น๊ตฌ์ธ์ง๋ฅผ ํ๋ณํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์ธ์.
๋ ํ์์ด ์น๊ตฌ์ด๋ฉด โYES"์ด๊ณ , ์๋๋ฉด โNO"๋ฅผ ์ถ๋ ฅํ๋ค.
โฃ ์
๋ ฅ์ค๋ช
์ฒซ ๋ฒ์งธ ์ค์ ๋ฐ ํ์์์ธ ์์ฐ์ N(1<=N<=1,000)๊ณผ ์ซ์์์ ๊ฐ์์ธ M(1<=M<=3,000)์ด ์ฃผ์ด์ง๊ณ , ๋ค์ M๊ฐ์ ์ค์ ๊ฑธ์ณ ์ซ์์์ด ์ฃผ์ด์ง๋ค.
๋ง์ง๋ง ์ค์๋ ๋ ํ์์ด ์น๊ตฌ์ธ์ง ํ์ธํ๋ ์ซ์์์ด ์ฃผ์ด์ง๋ค.
โฃ ์ถ๋ ฅ์ค๋ช
์ฒซ ๋ฒ์งธ ์ค์ โYES"๋๋ "NO"๋ฅผ ์ถ๋ ฅํ๋ค.
โฃ ์
๋ ฅ์์ 1
9 7
1 2
2 3
3 4
4 5
6 7
7 8
8 9
3 8
โฃ ์ถ๋ ฅ์์ 1
NO
์์ ๋ฌธ์ ๋ฅผ ๋ณด๋ฉด ๋ฑ ์ค๋ช ์ ๋ง๋ ๊ฒฝ์ฐ์ด๋ค.
์ ๋ฌธ์ ์ ํด๊ฒฐ ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
int n, m, a, b;
int unf[1001];
int Find(int v)
{
if (v == unf[v])
return v;
else
return unf[v] = Find(unf[v]);
}
void Union(int a, int b)
{
a = Find(a);
b = Find(b);
if (a != b) unf[a] = b;
}
void solve()
{
cin >> n >> m;
for (int i = 1; i <= n; ++i)
unf[i] = i;
for (int i = 1; i <= m; ++i)
{
cin >> a >> b;
Union(a, b);
}
int fa, fb;
cin >> a >> b;
fa = Find(a);
fb = Find(b);
if (fa == fb)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
freopen("input.txt", "rt", stdin);
solve();
return 0;
}
๋ถ์ํ๊ธฐ!
Find
int Find(int v)
{
if (v == unf[v])
return v;
else
return Find(unf[v]);
}
์ด๋ ๊ฒ ๋ก์ง์ ์ง ๋ค๋ฉด ๊ณ์ํด์ ๊ผฌ๋ฆฌ์ ๊ผฌ๋ฆฌ๋ฅผ ๋ฌด๋ ํ์์ผ๋ก Find๊ฐ ์ด๋ฃจ์ด์ง๋ค.
๊ทธ๋๋ ๊ฐ์ ๊ทธ๋ฃน๋ผ๋ฆฌ ๋ฌถ์ธ๋ค.
Find
int Find(int v)
{
if (v == unf[v])
return v;
else
return unf[v] = Find(unf[v]);
}
์ด๋ฐ์์ผ๋ก ์ง๊ฒ ๋๋ค๋ฉด ๋ฉ๋ชจ์ด์ ์ด์
์ด๋๋ค.
unf[v] = Find(unf[v]);
์ด ๋ถ๋ถ์ด ์ต์๋จ ๋ถ๋ถ๊ณผ ๋ฐ๋ก ์ฐ๊ฒฐํ๊ฒ ๋ง๋ ๋ค.
Union
void Union(int a, int b)
{
a = Find(a);
b = Find(b);
if (a != b) unf[a] = b;
}
Union์ ๊ฐ์ ๊ทธ๋ฃน์ผ๋ก ๋ง๋๋ ํจ์์ด๋ค. b๊ฐ ๋จธ๋ฆฌ a๊ฐ ๊ผฌ๋ฆฌ๋ฅผ ๋งก๊ฒ๋๋ ํจ์.
๋ฌธ์ ํด๊ฒฐ ํจ์ ๋ถ์!
void solve()
{
cin >> n >> m;
for (int i = 1; i <= n; ++i)
unf[i] = i; // ์๊ธฐ ์์ ์ด ํจ์์ด๋ค.
for (int i = 1; i <= m; ++i)
{
cin >> a >> b;
Union(a, b); // b๊ฐ ๋จธ๋ฆฌ๊ฐ๋๊ณ a๊ฐ ๊ผฌ๋ฆฌ๊ฐ๋๋ฉฐ ํจ์ ํฉ์น๊ธฐ
}
int fa, fb;
cin >> a >> b;
fa = Find(a);
fb = Find(b);
if (fa == fb)
cout << "YES" << endl;
else
cout << "NO" << endl;
}