Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- disjoint-set
- dynamic programming
- BFSDFS
- Euler circuit
- graph
- Algospot
- hashing
- BOJ
- flows
- Shortest path
- graph modeling
- Euler path
- Greedy
- Dag
- backtracking
- BST
- scc
- POJ
- Eulerian path
- GCD
- Eulerian circuit
- CS Academy
- Sieve_of_Eratosthenes
- DynamicProgramming
- bitmask
- implementation
- Segment Tree
- mathematics
- Cycle detecting
- 백준
Archives
- Today
- Total
그냥 하는 노트와 메모장
BOJ 2176 합리적인 이동경로 본문
* BOJ 2176 합리적인 이동경로
[분류 : 다이나믹 프로그래밍/ 최단 경로]
분류에서 보이듯 굉장히 희한한 문제다. 심지어 그래프 + 다이나믹인데, 트리 + 다이나믹은 익숙하지만 이런 조합은 처음 봤다.
[풀이]
S에서 T로 가능 경로는 반드시 T로 가까워져야 한다는 조건이 있는데, 이는 거꾸로 말하면 T로 멀어지면 안된다는 뜻이다. 보다 정확하게 말하면 S에서 T로 가능 경로 중에 사용된 간선 집합을 P라고 정의할 때, 방향 간선 (u, v)에 대해 u 위치에 있을 때보다 v로 이동하면 T에 더 가까워져야 함을 알 수 있다.
정리하면 아래처럼 정의할 수 있다.
증명)
역으로 u가 v보다 T로부터 가깝다고 하자(du < dv). 그렇다면 현재 위치 u까지 왔을 때, T에 가까워지기 위해서는 v로 이동했을 때의 거리가 현재보다 작아야 하는데, 그렇지 못함을 바로 자명하게 알 수 있다. 따라서 T에 가까워지기 위한 최소 조건은 위에 있는 수식을 만족해야함을 알 수 있습니다.
구현)
최단 경로는 일반적인 가중치 최단거리 알고리즘 하나를 골라서 사용하면 됩니다. 가중치가 양수이니 벨만을 써도 상관 없구요. 저는 간단하게 SPFA를 사용했습니다.
이후 다이나믹 구성은 현재 위치에 대해 위 수식이 만족하는지만 확인하면 되므로 꽤 간단하게 구현할 수 있습니다.
(만약 가중치 C가 0이란 값을 가질 수 있었다면 어떻게 됐을런지..)
'Solved problems' 카테고리의 다른 글
BOJ 12977 - 원 위의 점 (0) | 2019.11.22 |
---|---|
온코더 제12회차 3번 문제 '격자 칠하기' 풀이 (0) | 2019.11.12 |
BOJ 17242 Kaka & Bebe (0) | 2019.06.24 |
BOJ 1866 - 택배 (2) | 2019.03.27 |
FFT 관련 문제들(상대적 쉬움) (0) | 2019.02.23 |
Comments