이문제 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
10
1
코딩살구클럽 가입문의
0
55
2
3-K private case 질문
0
55
2
안녕하세요. 코딩살구클럽 문의드립니다!
0
70
2
7:41 듣다가 질문합니다
0
63
2
코드 리뷰 요청드립니다!
0
62
2
코딩살구클럽 계정 문의
0
64
2
SK하이닉스 대비 강의수강
0
193
3
코딩살구클럽 등록부탁드립니다.
0
65
2
7-F 재귀로 풀시 런타임애러
0
63
1
1-N 문제 질문입니다. (+ 채점오류)
0
71
2
코딩살구클럽 가입 확인 부탁드립니다.
0
81
2
직장인 코테 합격 공부방법 문의
0
107
2
코딩살구클럽 가입 방법
0
88
2
6-H 체점 관련 질문
0
69
1
채점서버 연결 관련 질문입니다
0
98
2
삼성 s직군
0
84
1
삼성 코테 없어짐
0
193
1
코딩살구클럽 가입부탁드립니다
0
85
2
코딩살구클럽 가입 요청 확인부탁드립니다
0
66
2
5-S 테스트 케이스 질문
0
69
2
코살 문제풀이 환경
0
81
2
2 - T 오큰수 문제가 있는 것 같습니다.
0
74
1
추천 추가문제들
0
68
2





