3. POSTECH Computer Algorithm Team
Concept
- Graph : 현실의 문제를 풀기 위한 model 중 하나.
- 현실의 많은 문제들은 Graph로 치환이 가능하다.
- Tree : Connected acyclic graph
- 즉, Cycle이 없는 Graph가 Tree다.
- Tree는 왜 중요할까?
Graph & Tree
4. POSTECH Computer Algorithm Team
Concept
- Tree : Connected Acyclic Graph
- Connected : 임의의 두 vertex u, v에 대해서, u와 v를 잇는 Path가 반드시 존재한다.
- Acyclic : 임의의 두 vertex u, v에 대해서 u와 v를 잇는 Path가 존재 한다면, 이는 반드시 유일하다.
- 따라서, Connected Acyclic Graph에서는 u와 v를 잇는 Path가 반드시 유일하게 존재한다.
- Path가 유일하게 존재하기 때문에 탐색이 용이하며, vertex들에 특수한 성질을 부여할 수 있다(level, rank, ...)
Graph & Tree
5. POSTECH Computer Algorithm Team
Concept
- Graph에서의 어려운 문제들은 Tree에서는 매우 쉽게 풀린다.
- Minimum distance, Maximum flow 등등은 Tree에서 탐색 한번으로 풀린다.
- Find Diameter, Radius of Graph : NP-Complete 문제이지만 Tree에서는 P다.
- 따라서, Graph를 강제로 Tree를 만들고 싶다.
- 어떻게? => Spanning Tree
Graph & Tree
6. POSTECH Computer Algorithm Team
Concept
- Spanning Tree : Graph G에 대해서, 다음 조건을 만족하는 Tree T를 찾고 싶다.
1. G의 vertex set = T의 vertex set
2. G의 edge set > T의 edge set
- 이때, 가장 적은 Edge weight 합을 가지는 Tree T를 Minimum Spanning Tree라고 한다.
- Find Minimum Spanning Tree Algorithm : Prim, Kruskal...
Graph & Tree
7. POSTECH Computer Algorithm Team
Concept
- Spanning Tree를 찾는 또다른 방법 중 하나.
- Graph G의 DFS Tree T는 다음 방법을 통하여 만든다.
1. 임의의 점 u를 G에서 잡는다.
2. u에서 방문하지 않는 node v를 잡는다.
3. v를 T에 넣고, (u,v)를 T에 넣는다.
4. v에서 다시 방문하지 않는 node를 찾고 2~3을 반복한다.
5. 방문하지 않은 node가 없다면, 부모로 올라간다.
6. 더이상 부모가 없다면, 임의의 node를 다시 잡는다.
DFS Tree
10. POSTECH Computer Algorithm Team
Concept
- DFS Tree는 Rooted Tree다.
- 모든 vertex는 level을 가진다.
- 모든 vertex는 자식 vertex들을 가지며, root를 제외한 vertex들은 부모 vertex를 반드시 1개 가진다.
- 모든 DFS Tree는 Hidden Edge를 가진다!(중요)
DFS Tree
11. POSTECH Computer Algorithm Team
Concept
- DFS Tree의 Edge는 실제 DFS를 돌며 이동한 Edge와 아닌 Edge로 나눌 수 있다.
- DFS Tree의 정의에 따라, DFS를 따라 돌며 이동한 Edge는 T의 Edge와 같게 된다. 이런 Edge는 주로 실선으로 표
현한다.
- DFS를 따라 돌며 이동한 Edge가 아닌 경우 점선으로 표현한다.
DFS Tree
12. POSTECH Computer Algorithm Team
Concept
- 실선 Edge들의 경우, Tree Edge라고 부른다.
- 점선 Edge들의 경우, 3가지 경우로 나눌 수 있다.
1. u에서 v로 가는 Edge고, v의 조상중 하나가 u라면, (u,v)를 Forward Edge라고 부른다.
2. u에서 v로 가는 Edge고, u의 조상중 하나가 v라면, (u,v)를 Back Edge라고 한다.
3. u에서 v로 가는 Edge고, u와 v가 서로 조상 관계를 만족하지 않으면, (u,v)를 Cross Edge라고 한다.
- Undirected Graph의 경우, Forward Edge와 Cross Edge가 존재하지 않는다.
DFS Tree
14. POSTECH Computer Algorithm Team
Concept
- DFS[n] = Vertex n의 DFS 방문 number
- Level[n] = Vertex n의 DFS Tree에서의 level
- Back[n] = Vertex n을 root로 하는 subtree의 모든 vertex v에 대해, 최대 1번의 Back Edge를 통해 올라갈 수 있
는 vertex들 중 가장 최소의 Level을 가지는 Vertex.
- DFS, Level, Back은 Tree 탐색으로 O(n)만에 계산 할 수 있다.
- Back[n] = min( Level[backedge(n)], Back[u] ) for all u s.t. u is child of n
DFS Tree
16. POSTECH Computer Algorithm Team
Concept
DFS Tree로 해결할 수 있는 문제들은 다음과 같다.
- 절점 찾기(Cut Vertex)
- 절선 찾기(Cut Edge)
- SCC(Strongly Connected Component)
DFS Tree
17. POSTECH Computer Algorithm Team
Concept
- 절점 : undirect connected 그래프 G에서 어떤 vertex v를 지웠을 때 G가 connected가 아니게 된다면, v를 G의
절점이라고 한다.
- 절선 : undirect connected 그래프 G에서 어떤 edge e를 지웠을 때 G가 connected가 아니게 된다면, e를 G의 절
선이라고 한다.
- 어떻게 찾을까?
트리의 절점, 절선은 어떻게 될까?
Cut Vertex, Edge
19. POSTECH Computer Algorithm Team
Concept
- Tree에서 vertex v를 지우면 v의 자식들을 root로 가지는 subtree들로 잘린다.(파란색 Tree)
- 그리고, 전체 Tree에서 v의 subtree를 뺀 나머지 집합들이 생긴다.(주황색 Tree)
- v가 절점이 아니려면, 모든 파란색 Tree와 주황색 Tree 사이에 Edge가 있어야 한다.
- 파란색 Tree와 주황색 Tree에 Edge가 있다면, Back Edge가 있는 것이다!
Cut Vertex
20. POSTECH Computer Algorithm Team
Concept
- 특정 vertex v에 대해서, v의 모든 자식들에 대해 확인을 한다.
- 만약 모든 자식 child[v][i]에 대해,
- level[ back[ child[v][i] ] ] < level[ v ] 라면,
- v는 절점이 아니다.
- 하나의 자식이라도 level [ back [ child[v][i] ] ] >= level[v]면,
- v는 절점이다.
Cut Vertex
22. POSTECH Computer Algorithm Team
Concept
- 절선은 항상 DFS Tree의 Tree Edge들이다.
- 잘린 Edge가 (u, v)고, level[u] > level[v]라고 하자.
- u != back[u]면, (u, v)는 절선이 아니다.
- u = back[u]면 (u, v)는 절선이다.
Cut Edge
23. POSTECH Computer Algorithm Team
Concept
- 방향 그래프 G에 속한 임의의 vertex v0,v1,...,vk에 대해 v0->v1->v2->....->vk->v0로 가는 Edge들이 G에 속하
면, 이것을 SCC라 부른다.
- SCC를 알아내는 방법 : Kosaraju’s algorithm
- DFS 돌리고, 역방향 Edge 만들고, DFS number 따라 DFS 돌리고 색을 매긴다.
- 현실 코딩에서는 꽤 복잡하고 귀찮은 일이다.
SCC
24. POSTECH Computer Algorithm Team
Concept
Tarjan Algorithm
- Graph에 Cycle이 있다면, 그 Cycle의 Edge중 적어도 하나는 Back Edge여야 한다.
- root부터 Tree를 탐색하며, back[u] != u인 경우를 찾는다.
- back[u] != u라면, u 보다 더 높이 올라가는 Back Edge가 있다는 뜻이므로, u를 back[u]와 같은 색깔로 칠한다.
SCC
25. POSTECH Computer Algorithm Team
Concept
- 안타깝게도 위 방법은 Cross Edge가 있으면 틀린 알고리즘이다.
- 왜냐하면, back이란 배열은 Cross Edge를 생각하지 않고 만든 배열이기 때문이다.
- ret이라는 배열을 새로 만들면 된다. ret이란, Cross Edge까지 전부 고려했을 때 Back Edge 최대 1개를 사용하여
최대한 올라갈 수 있는 vertex의 number다.
- cross edge로 Tree Edge 보듯 실행시키면 된다.
Q) Cross edge는 어떻게 판별하지?
SCC
26. POSTECH Computer Algorithm Team
Concept
- Least Common Ancestor : Tree의 vertex u, v가 있을 때, u와 v의 최소 공통 조상을 LCA라고 한다.
- 즉, w가 u와 v의 LCA라고 하자. 임의의 a가 u와 v의 조상이면, 항상 a는 w의 조상 혹은 w 자기 자신이다.
- edge (u, v)가 있다고 하자. 이 edge가 front edge 혹은 back edge라면, LCA(u, v) = u 혹은 v다.
- edge (u, v)가 cross edge라면, LCA(u, v)는 u도 v도 아니다!
- LCA(u, v)는 어떻게 찾지?
LCA
27. POSTECH Computer Algorithm Team
Concept
- for문으로 조상을 하나 하나 찾아가면 LCA를 구할 수 있다.
- 하지만, 이 방법은 O(n)의 시간을 가지므로, 비효율적이다.
- Sparse Table을 사용하면 O(logn)의 시간으로 LCA를 찾을 수 있다.
- Sparse Table이란, 유한결정오토마타의 n번째 이후의 상태를 logn만에 구하는 방법이다.
- Sparse[s][t] = State s의 2^t번째 이후의 상태
- Sparse[s][0] = next[s]
- sparse[s][t] = sparse[sparse[s][t-1]][t-1]
LCA
28. POSTECH Computer Algorithm Team
Concept
LCA(u,v)를 구하는 법
- u와 v의 높이 혹은 레벨이 같도록 u와 v를 조상으로 이동시킨다.
- 초기 min과 max를 적당히 설정한다.
- h=(min+max)/2번째 조상을 본다. 이게 만약 u와 v의 공통조상이라면, 최소공통조상은 이 이하에 있다. max = h-1
- 만약 u와 v의 공통 조상이 아니라면, min = h+1
- 시간 복잡도 O(log^2n)
- 조금만 생각하면 O(logn)으로 시간을 줄일 수 있다.
LCA
29. POSTECH Computer Algorithm Team
이제 cross edge를 판별할 수 있으면, 다음과 같이 scc를 구성할 수 있다.
1. u와 back[u]는 같은 scc.
2. Edge(u, v)가 cross edge이고, level[ret[u]] <= level[LCA(u, v)]이면 u와 ret[u]는 같은 scc.
만약 이미 u와 v가 다른 scc로 되어 있다면, union find를 사용하여 합치자.
- 여담으로 실제 tarjan algorithm은 LCA를 안 쓰고, stack을 사용하여 cross edge를 해결한다.
- 하지만 아이디어는 동일하니, LCA를 쓰는 방법도 기억해두자.
30. POSTECH Computer Algorithm Team
More
- https://www.acmicpc.net/problem/11724
- https://www.acmicpc.net/problem/1707
- https://www.acmicpc.net/problem/1761
- https://www.acmicpc.net/problem/11438
- Hard) https://www.acmicpc.net/problem/13511
- Hard) https://www.acmicpc.net/problem/10265