μ΄λ² ν¬μ€ν μμλ Union-Find μκ³ λ¦¬μ¦μ C μΈμ΄λ‘ ꡬνν μμλ₯Ό μκ°νκ² μ΅λλ€. μ΄ μκ³ λ¦¬μ¦μ κ·Έλν λ¬Έμ μμ μλ‘μ μ§ν©μ κ΄λ¦¬ν λ μ μ©νκ² μ¬μ©λλ©°, μ£Όλ‘ μ¬μ΄ν΄ κ²μΆμ΄λ μ΅μ μ μ₯ νΈλ¦¬λ₯Ό μ°Ύμ λ λ§μ΄ νμ©λ©λλ€.
μλ μμ μμλ λ κ°μ§ μ£Όμ μ°μ°μΈ Find
μ Union
μ ν΅ν΄ μ§ν©μ κ΄λ¦¬νκ³ , λ§μ§λ§μ λ λ
Έλκ° κ°μ μ§ν©μ μν΄ μλμ§λ₯Ό νλ³ν©λλ€.
#include<stdio.h>
int n, parent[1001]; // λ
Έλ κ°μμ λΆλͺ¨ λ°°μ΄ μ μΈ
// π΅οΈββοΈ Find ν¨μ: ν΄λΉ λ
Έλκ° μν μ§ν©μ λν(루νΈ) λ
Έλλ₯Ό μ°Ύλ ν¨μμ
λλ€.
int Find(int v)
{
if (parent[v] == v)
return v; // λ£¨νΈ λ
Έλμ΄λ©΄ μκΈ° μμ μ λ°νν©λλ€.
else
return parent[v] = Find(parent[v]); // κ²½λ‘ μμΆμΌλ‘ λΆλͺ¨λ₯Ό 루νΈλ‘ κ°±μ νλ©° λ°νν©λλ€.
}
// π Union ν¨μ: λ μ§ν©μ ν©μΉλ ν¨μμ
λλ€.
void Union(int x, int y)
{
x = Find(x); // xμ 루νΈλ₯Ό μ°Ύμ΅λλ€.
y = Find(y); // yμ 루νΈλ₯Ό μ°Ύμ΅λλ€.
if (x != y)
parent[x] = y; // λ 루νΈκ° λ€λ₯΄λ©΄ yλ₯Ό xμ λΆλͺ¨λ‘ μ€μ ν©λλ€.
}
// π οΈ μ΄κΈ°ν ν¨μ: λͺ¨λ λ
Έλμ λΆλͺ¨λ₯Ό μκΈ° μμ μΌλ‘ μ€μ ν©λλ€.
void Set()
{
int i;
for (i = 1; i <= n; i++)
parent[i] = i; // μ²μμλ κ° λ
Έλκ° μκΈ° μμ μ λΆλͺ¨λ‘ κ°μ§λλ€.
}
int main(void)
{
int m, i, a, b;
scanf("%d %d", &n, &m); // λ
Έλ κ°μμ μ°μ° νμλ₯Ό μ
λ ₯λ°μ΅λλ€.
Set(); // μ΄κΈ°νν©λλ€.
// π mλ²μ Union μ°μ°μ μνν©λλ€.
for (i = 0; i < m; i++)
{
scanf("%d %d", &a, &b);
Union(a, b); // aμ bλ₯Ό κ°μ μ§ν©μΌλ‘ ν©μΉ©λλ€.
}
// β aμ bκ° κ°μ μ§ν©μ μνλμ§ νμΈν©λλ€.
scanf("%d %d", &a, &b);
if (Find(a) == Find(b))
printf("YES\n"); // κ°μ μ§ν©μ μνλ©΄ YESλ₯Ό μΆλ ₯ν©λλ€.
else
printf("NO\n"); // κ·Έλ μ§ μμΌλ©΄ NOλ₯Ό μΆλ ₯ν©λλ€.
return 0;
}
Find(int v)
v
κ° μν μ§ν©μ λ£¨νΈ λ
Έλλ₯Ό μ°Ύμ΅λλ€.Union(int x, int y)
x
μ y
λ₯Ό κ°μ μ§ν©μΌλ‘ ν©λ³νλ μν μ ν©λλ€.x
μ 루νΈλ₯Ό y
μ 루νΈλ‘ κ°±μ νμ¬ ν©μΉ©λλ€. πSet()
μ
λ ₯:
5 4
1 4
2 4
3 4
4 5
1 5
μΆλ ₯:
YES
Union-Find μκ³ λ¦¬μ¦μ μλ‘μ μ§ν©μ ν¨μ¨μ μΌλ‘ κ΄λ¦¬ν μ μλ λνμ μΈ μκ³ λ¦¬μ¦μ
λλ€. Find
μ Union
μ°μ°μ ν΅ν΄ μ§ν©μ λ³ν©νκ³ , κ²½λ‘ μμΆ κΈ°λ²μΌλ‘ μ±λ₯μ μ΅μ νν μ μμ΅λλ€. π‘
κ·Έλν νμμ΄λ μ¬μ΄ν΄ κ²μΆ λ¬Έμ μμ μμ£Ό μ¬μ©λλ κΌ μ΅νλμκΈ° λ°λλλ€. π
κΆκΈν μ μ΄ μκ±°λ μ½λμ λν λ¬Έμμ¬νμ΄ μμΌμλ©΄ μΈμ λ μ§ λκΈλ‘ λ¨κ²¨μ£ΌμΈμ! π€