그래프 알고리즘 기초 - 유니온 파인드
By on November 22, 2023
그래프 알고리즘 기초 - 유니온 파인드
- 유니온 파인드 알고리즘(Union-Find)
여러 노드가 주어 졌을 경우 두개의 노드를 1개의 집합으로 묶는 Union 연산과 같은 집합인지 확인하는 Find 연산으로 구성 되어있다.
1차원 배열을 사용 하여 유니온파인드 알고리즘 구현 방법
private static int[] graph;
@Test
void 그래프변환(){
graph = new int[5 + 1]; // 노드 개수(N) 만큼 생성
for(int i = 1; i < graph.length; i++){
graph[i] = i; //노드값 초기화
}
// 예 : 1, 3, 4, 5 는 연결선을 가지고 있다.
// 2는 연결선을 가지고 있지 않다.
union(1, 3);
union(3, 4);
union(3, 5);
System.out.println(Arrays.toString(graph)); // 출력 값 : [0, 1, 2, 1, 1, 1]
// 1,3,4,5 는 1번을 상위 노드로 하나의 집합이다.
// 2는 자기 자신이 상위 노드로 하나의 집합이다.
System.out.println(find(2)); // 출력 값 : 2
System.out.println(find(5)); // 출력 값 : 1 // 5 -> 3 -> 1 순으로 상위 노드를 찾는다.
}
private void union(int x, int y){
x = find(x); // 입력 받은 X의 상위 노드 찾기
y = find(y); // 입력 받은 Y의 상위 노드 찾기
if(x == y) return; // 같은 그래프에 속해 있다면 리턴.
if(x <= y) { //작은 노드를 업데이트 한다.
graph[y] = x;
}else{
graph[x] = y;
}
}
private int find(int x){
if(graph[x] == x){
return x;
}
return find(graph[x]); // 재귀를 통해서 상위 노드를 찾아 나간다.
}