티스토리 뷰
서론
필요한 사전지식
본론
단계
2. 새로 번호를 매긴 노드들을 dfs로 방문하여서 각 노드의 깊이를 기준으로 배열을 펼친다. 모든 Edge를 두번 방문하므로 배열의 총 길이는 2*N-2이 된다. 공간복잡도는 이 된다. 모든 간선을 두번씩 방문하므로 의 시간이 소모된다.
3. 펼친거에서 RMQ를 적용시킨다. ( RMQ : Range Min Query의 줄임말로, 세그먼트 트리나 Sparse table을 활용하여 구간 내의 최소값을 구하는 과정이다)
각 단계별 설명을 자세히 해보도록 하겠다. 펜을 들고 아무 트리나 그린다음에, 차례대로 해보길 바란다.
First + Second
다음 3개를 기록해내는 dfs 코드는 다음과 같다.
void dfs(int cur,int depth) { Serial[idx]=cur; Fi[cur]=idx; Dep[idx++]=depth; for(int i=0;i<child[cur].size();i++) { dfs(child[cur][i],depth+1); Serial[idx]=cur; Dep[idx++]=depth; } }
이렇게 하면, 성공적으로 Serial과 Fi, Dep배열의 갱신에 성공하였다!
Third
이제 두 정점 u,v의 LCA를 구하는 문제는 다른 문제로 변한다.(u>v) 바로 Serial[RMQ(Fi[u],Fi[v])]이다. 여기서 구하는 RMQ는 Dep 배열에 대한 RMQ이다. 세그먼트가 최소값을 띄는 인덱스를 반환한다하면 Serial을 씌워줘야 할 것이고, 값을 반환해준다면 Serial을 씌울 필요가 없다.
Fi[u]와 Fi[v] 숫자들 사이에 존재하는 가장 작은 깊이를 찾고, 이가 몇번째로 방문했는지 알 수 있으므로 Serial에 넣으면 몇번째 정점이 나온다.
Time Complexity
시간복잡도를 분석하자.
세그먼트 트리를 만드는데 O(N)이 소요되고, 만약 거리를 구하는 쿼리라면 일반적인 세그트리에서 값을 추적하는 거랑 동일하므로 O(logN)의 시간이 소요된다. 쿼리를 Q개라고 하면, 총 소모하는 시간복잡도는 O(N+QlogN)이다.
결론
일단 LCA에 대한 개념복습 겸 익힐 겸 문제를 조금 더 풀고, IOI 2014 Game 풀어봐야겠다
수정(05-29,22:37)
'알고리즘' 카테고리의 다른 글
구간 트리(Segment tree) 비재귀 코딩방법 (0) | 2018.05.31 |
---|---|
JOI 18 , Stove (0) | 2018.05.30 |
문제 풀이 의식적 흐름( IOI 2014, Game ) - 도전중 (0) | 2018.05.28 |
APIO 2015 Bali's sculptrues (0) | 2018.05.28 |
JOI 2018 Tents (0) | 2018.05.28 |
- Total
- Today
- Yesterday
- 세그먼트 트리
- PMA
- mathematics
- 백준
- LInear SVM
- 선형대수학
- 로피탈
- Deep learning
- 수(상)
- 연습문제
- Machine Learning
- Derivate
- PMA 연습문제
- joi
- 17411
- 해석학 Ch5
- 해석학 Chapter 5
- JOI 2021
- PMA Ch5
- Differentation
- 해석학
- Backprop
- 수학
- icpc.me/17411
- 미분
- 백준 17411
- Trace trick
- cs231n assignment1
- 해석학II
- Trace tirck
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |