문제 연결
문제 요약
아래 두 가지 방법을 완료하십시오.
- Union: 두 개의 하위 집합을 하나로 병합
- isConnected: 두 하위 집합이 하위 집합인지 여부에 따라 true 또는 false를 반환합니다.
문제를 해결하다
class Solution
{
public int find(int x, int par()) {
while(x != par(x)) {
x = par(x);
}
return x;
}
//Function to merge two nodes a and b.
public void union_(int a, int b, int par(), int rank())
{
a = find(a, par);
b = find(b, par);
if(a==b) return;
if(rank(a) >= rank(b)) {
rank(a) += rank(b);
par(b) = a;
} else {
rank(b) += rank(a);
par(b) = a;
}
return;
}
//Function to check whether 2 nodes are connected or not.
public Boolean isConnected(int a, int b, int par(), int rank())
{
a = find(a, par);
b = find(b, par);
if(a==b) return true;
else return false;
}
}
전형적인 Union-Find 연산.
구글링하면 Union-Find 알고리즘에 대한 간단한 설명이 있습니다. 개념을 이해하고 위의 기본 공식을 기억한다면,
비슷한 문제는 쉽게 풀 수 있습니다.
시간적 복잡성
O(N+Q)
N: 노드 수
Q: 쿼리 수

