이문제 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]);
}
}
3-F 채점 관련 질문
0
4
0
BFS, DFS 활용이 되는 상황에서의 방향성
0
10
2
코딩살구클럽 승인
0
17
2
코딩살구클럽승인
0
14
2
코딩살구클럽 승인
0
43
2
3-D 관련 질문
0
33
2
코살구 회원가입 문의
0
38
2
코살구 로그인 문제
0
60
2
3-A 문제 풀이 관련 질문
0
51
3
2-O 질문 있습니다
0
38
2
2-T 문제에 관한 질문
0
38
2
코딩 살구 클럽 접속 및 사용방법 문의
0
57
2
안녕하세요~. 현재 코살코딩클럽 사이트가 접속이 안됩니다~
0
64
2
코딩살구클럽 로그인문제
0
74
3
코딩 살구 클럽 로그인 문제
0
79
2
2-J 채점관련 질문
0
65
3
코딩 살구 클럽 Python 지원 가능 여부
0
77
1
살구클럽 아이디 없음 문제
0
76
1
1-O 코딩살구클럽 채점관련 질문
0
60
2
히든 테스트 케이스가 사라졌습니다
0
57
1
채점서버 혹시 다른 언어 지원도 가능하게 해주실 수 있나요
1
74
2
살구 클럽 채점 관련 문의(테스트 케이스)
0
66
2
1-H 문제 채점하기 오류
0
58
3
코딩살구클럽 2주차 2-L 문제 채점하기 오류
0
52
2

