[그래프] 서로소 집합 Union-Find, 위상정렬, 최소신장트리
2023. 7. 31. 10:57
그래프
- 무향 간선 : 방향이 존재하지 않는 간선
- 유향 간선 : 방향이 존재하는 간선
- 인접 Adjacent : 정점A, B를 바로 잇는 간선이 존재한다면 A, B는 인접하다.
- 차수 Degree : 정점에 존재하는 간선의 수
- in-degree : 정점에 들어오는 간선의 수
- out-degree : 정점에서 나가는 간선의 수
- 그래프의 종류
- 무향 그래프 : 무항 간선으로 이루어진 그래프
- 유향 그래프 : 유향 간선으로 이루어진 그래프
- 가중치 그래프 : 가중치를 갖는 간선으로 이루어진 그래프
- 완전 그래프 : 임의의 두 정점에 대해 이를 잇는 간선이 존재하는 그래프 (모든 노드가 연결되어있고, 인접해있음)
- 연결 그래프 : 임의의 두 정점에 대해 이를 잇는 경로path가 존재하는 그래프
- 트리 그래프 : 순환(사이클)을 갖지 않는 연결 그래프(=임의의 두 정점에 대해 경로가 1개 존재한다) → 즉, 하나의 간선을 지웠을 때 더 이상 하나의 그래프로 이루어지지 않고, 두 개 이상의 그래프로 분리된다.(=연결 그래프가 아니다) + 간선을 추가했을 때 사이클이 생긴다.
그래프 표현

① 간선 리스트 Edge List
k | start | end | cost |
---|---|---|---|
1 | 1 | 2 | 6 |
2 | 1 | 3 | 2 |
3 | 2 | 4 | 1 |
4 | 3 | 2 | 3 |
5 | 3 | 4 | 5 |
② 인접 행렬 Adjacency Matrix
: V가 크면 못 씀. (공간복잡도 때문에)
start/end | 1 | 2 | 3 | 4 |
---|---|---|---|---|
1 | 0 | 6 | 2 | 0 |
2 | 0 | 0 | 0 | 1 |
3 | 0 | 3 | 0 | 5 |
4 | 0 | 0 | 0 | 0 |
③ 인접 리스트 Adjacent List
start | 1 | 2 | 3 | 4 |
---|---|---|---|---|
List | ↓ | ↓ | ↓ | ↓ |
end,cost | 2, 6 | 4, 1 | 2, 3 | |
3, 2 | 4, 5 |
... | ① 간선 리스트 | ② 인접 행렬 | ③ 인접 리스트 |
---|---|---|---|
공간 | E | V2 | V+E |
정점 A에 있는 간선을 모두 찾는데 걸리는 시간 | E | V | deg(A) |
정점 A,B가 연결되어 있는지 확인하는 시간 | E | 1 | min |
정점 삽입 | 1 | V^2 (행렬을 새로운 행렬로 옮기는데) | 1 (만약 List로 구현한다면 V가 됨.) |
간선 삽입 | 1 | 1 | 1 |
서로소 집합 (Disjoint Set, Union-Find)
- Union 연산 : 각 원소가 속한 집합을 하나로 합치는 연산.
- Find 연산 : 원소가 속한 집합 대표번호를 리턴하는 연산.
위상정렬(Topological Sort)
- DAG(Directed Acyclic Graph) : 순환을 가지지 않는 방향그래프.
- 선행자(predecessor), 후행자(successor)
- 즉각 선행자(immediate predecessor), 즉각 후행자(predecessor successor)
- 선행자(predecessor), 후행자(successor)
- in-degree가 0인 노드는 바로 방문할 수 있다.
- 만약 방문한다면 그 노드의 out-degree 간선을 없앨 수 있다. (→ 즉, 이 과정을 통해 다른 노드(즉각 후계자)의 in-degree가 줄어들 수도 있다.)
- 위상정렬의 결과는 유일하지 못 하는데, 문제에서 이 기준을 보통 정해준다.
- 이를 priority_queue + compare 함수로 구현할 수 있음.
트리(Tree)
- 사이클이 존재하지 않는 그래프.신장 트리(Spanning Tree)
- 무향 연결 그래프의 부분그래프이고, 그래프의 모든 정점을 포함하는 트리인 그래프.
- V개의 노드가 존재할 때, V-1개의 간선이 필요하다.
- V개 이상이면 사이클이 존재하고, V-2개이면 여러개의 그래프가 된다.
- 즉, 노드 V개를 간선으로 연결해 모든 노드로 가는 경로가 존재하는 최소 그래프(트리)를 만들고 싶을 때 V-1개의 간선이 필요하다.최소 신장 트리(Minimum Spanning Tree / MST)
- 크루스칼 알고리즘 (Kruskal's Algorithm)
- 간선 리스트를 이용해, 간선들을 비용을 기준으로 오름차순 정렬한다. (O(E\log{E})) (→ 그리디함)
- 이 정렬을 순회하며, 간선들을 연결한다. 만약 간선을 연결했을 때 사이클이 생긴다면 이 간선을 연결하지 않는다. (O(N))
- 사이클이 존재하는지 확인하는 방법 (DFS(N^2), BFS, 유니온파인드)
=====> O(E\log{E})프림 알고리즘 (Prim's Algorithm)(다익스트라와 헷갈리지 않도록, 차이점 : 주어진 그래프 내에서 신장 트리에 대한 문제 - 의 최소비용 / 두 노드 간의 경로 문제 - 의 최소비용 경로)
- 사이클이 존재하는지 확인하는 방법 (DFS(N^2), BFS, 유니온파인드)
- 나와 인접한 노드들을 연결한다.
- 인접한 노드로 이동해 그 중 가장 작은 간선을 선택해서 연결한다.
- BFS로 방문처리. (O(N) : 모든 노드들을 한 번씩은 방문해야해서.)
- Queue : 간선을 넣어줌. 즉 간선의 개수만큼 큐에 들어감. 비용의 최소값을 꺼내주면 된다. => 즉, priority queue.O(\log{n})
====> O(V\log{E})
'* 언어 | 알고리즘 > 알고리즘 개념' 카테고리의 다른 글
[트리] 최단경로 찾기 : 플로이드-워셜, 다익스트라, 벨만포드 (0) | 2023.08.03 |
---|---|
[트리] LCA, 오일러 투어, 단절점 찾기, (0) | 2023.08.01 |
[트리] 펜윅 트리 (0) | 2023.07.27 |
[정수론] 합동식의 성질, 에라토스테네스의 체, (확장) 유클리드 호제법 (0) | 2023.07.27 |
[트리] 이진 트리, 힙, 세그먼트 트리 (0) | 2023.07.26 |