이문제 union & find로 풀수 있는데 이경우 dfs와 비교했을때 시간복잡도는 어떤 접근법이 나은가요?
제목 그대로 union and find 알고리즘을 써서 이문제를 풀었습니다.
풀이를 보니 dfs를 써서 푸는 방법도 있는거 같은데 어떤 접근법이 시간 복잡도가 더 낮은 가요?
답변 3
0
안녕하세요 ㅎㅎ
UF가 근소하게 빠릅니다. DFS는 O(N + M)이지만 UF는 O(아커만(N) + M)이며 아커만의 특성상 O(1)에 가깝기 때문에 O(M)이라고 볼 수 있기 때문에 더 빠르지만... 사실 거의 비슷하다고 봐도 무방합니다.
실제로 UF와 DFS 제출 코드를 비교했을 때의 걸린 시간은 똑같은 것을 볼 수 있습니다.

참고로 UF로 푼 C++ 코드는 다음과 같습니다.
#include <cstdio>
using namespace std;
int parent[1004];
int find(int x) {
if (parent[x] == x) return x;
return parent[x] = find(parent[x]);
}
void unionSet(int a, int b) {
int pa = find(a);
int pb = find(b);
if (pa != pb) parent[pb] = pa;
}
int main(){
int t;
scanf("%d", &t);
while(t--){
int n, m;
scanf("%d %d", &n, &m);
bool isTree = true;
if(m != n - 1) {
for(int i = 0; i < m; i++){
int a, b;
scanf("%d %d", &a, &b);
}
printf("graph\n");
continue;
}
for(int i = 1; i <= n; i++){
parent[i] = i;
}
for(int i = 0; i < m; i++){
int a, b;
scanf("%d %d", &a, &b);
if(find(a) == find(b)) {
isTree = false;
} else {
unionSet(a, b);
}
}
if(isTree)
printf("tree\n");
else
printf("graph\n");
}
return 0;
}
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
0
자바이긴 합니다...
package _4thweek;
import java.util.Scanner;
public class Baekjoon13244 {
static int[] arr;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
for (int tc = 0; tc < t; tc++) {
int n = sc.nextInt();
int m = sc.nextInt();
boolean isTree = true;
arr = new int[n + 1];
if (m != n - 1) {
isTree = false;
}
for (int i = 1; i <= n; i++) {
arr[i] = i;
}
for (int i = 0; i < m; i++) {
int parent = sc.nextInt();
int child = sc.nextInt();
if (!union(parent, child)) {
isTree = false;
}
}
int root = find(1);
for (int i = 1; i <= n; i++) {
if (root != find(i)) {
isTree = false;
break;
}
}
if (isTree) {
System.out.println("tree");
} else {
System.out.println("graph");
}
}
}
static boolean union(int parent, int child) {
int rootA = find(parent);
int rootB = find(child);
if (rootA == rootB) {
return false;
}
arr[rootB] = rootA;
return true;
}
static int find(int node) {
if (arr[node] == node) {
return node;
}
return arr[node] = find(arr[node]);
}
}
채점서버 연결 관련 질문입니다
0
17
1
삼성 s직군
0
18
0
삼성 코테 없어짐
0
64
1
코딩살구클럽 가입부탁드립니다
0
39
2
코딩살구클럽 가입 요청 확인부탁드립니다
0
33
2
5-S 테스트 케이스 질문
0
37
2
코살 문제풀이 환경
0
51
2
2 - T 오큰수 문제가 있는 것 같습니다.
0
45
1
추천 추가문제들
0
44
2
프로그래머스 코테 환경 관련해서 질문드립니다.
0
50
2
해당 문제에 대한 채점이 코딩살구클럽에서 올바르게 처리되지 않습니다.
0
44
2
균형 이진 트리 설명 시 높이 숫자
0
33
2
4-H 질문드립니다.
0
37
2
1-K 질문드립니다.
0
43
2
대기업 인적성 시험 질문
0
43
2
4-C 질문드립니다
0
43
2
[수학숙제 / BOJ 2870] 채점 서버 오작동
0
40
1
코테 준비 질문
0
55
1
살구클럽가입 요청드려요
0
41
2
1-I 문제 질문
0
46
2
코딩살구클럽 가입
0
59
2
AI 코딩 도구 사용 시 학습 방법 조언
0
56
2
코딩살구클럽 오류
0
65
2
코살클 [3-F 괄호 추가하기] 프라이빗 9번 제보
0
51
1





