๋ฐ์ํ
์ต๋จ ๊ฒฝ๋ก(Shortest Path) ์๊ณ ๋ฆฌ์ฆ
- ๊ฐ์ฅ ์งง์ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ
- ๊ธธ ์ฐพ๊ธฐ ๋ฌธ์ ๋ผ๊ณ ๋ ๋ถ๋ฆผ
- ๊ทธ๋ํ๋ฅผ ์ด์ฉํ์ฌ ํํ
- ๊ฐ ์ง์ ์ ๋ ธ๋๋ก ํํ
- ์ง์ ๊ณผ ์ฐ๊ฒฐ๋ ๋๋ก๋ ๊ฐ์ ์ผ๋ก ํํ
- ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์ ์ ์ข
๋ฅ
- ๋จ์ผ ์ถ๋ฐ(single-source) ์ต๋จ ๊ฒฝ๋ก
- ์ด๋ค ํ๋์ ์ ์ ์์ ์ถ๋ฐํ์ฌ ๋๋จธ์ง ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฌธ์
- ๋จ์ผ ๋์ฐฉ(single-destination) ์ต๋จ ๊ฒฝ๋ก
- ๋ชจ๋ ์ ์ ์์ ์ถ๋ฐํ์ฌ ์ด๋ค ํ๋์ ์ ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฌธ์
- ๊ทธ๋ํ ๋ด์ ๊ฐ์ ์ ๋ค์ง์ผ๋ฉด ๋จ์ผ ์ถ๋ฐ ์ต๋จ๊ฑฐ๋ฆฌ ๋ฌธ์ ๋ก ๋ฐ๋ ์ ์์
- ๋จ์ผ ์(single-pair) ์ต๋จ ๊ฒฝ๋ก
- ๋ชจ๋ ์ ์ ์๋ค ์ฌ์ด์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฌธ์
- ๋จ์ผ ์ถ๋ฐ(single-source) ์ต๋จ ๊ฒฝ๋ก
- ์ฃผ์ ์๊ณ ๋ฆฌ์ฆ
- ๋ค์ต์คํธ๋ผ(Dijkstra) ์๊ณ ๋ฆฌ์ฆ
- ๋ฒจ๋ง-ํฌ๋(Bellman-Ford-Moore) ์๊ณ ๋ฆฌ์ฆ
- ํ๋ก์ด๋-์์ (Floyd-Warshall) ์๊ณ ๋ฆฌ์ฆ
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
- ํ๋์ ์ ์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ์ผ๋ก ๊ฐ๋ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ
- ์์ ๊ฐ์ ์ด ์์ ๋ ์ ์ ๋์
- ์์ ๊ฐ์ : 0๋ณด๋ค ์์ ๊ฐ์ ๊ฐ์ง๋ ๊ฐ์
- GPS ์ํํธ์จ์ด์ ๊ธฐ๋ณธ ์๊ณ ๋ฆฌ์ฆ
- ๋งค๋ฒ ๊ฐ์ฅ ๋น์ฉ์ด ์ ์ ๋ ธ๋๋ฅผ ์ ํํ๋ค๋ ์ ์์ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ถ๋ฅ๋จ
- ์๊ณ ๋ฆฌ์ฆ์ ์๋ฆฌ
- ์ถ๋ฐ ๋ ธ๋ ์ค์
- ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ ์ด๊ธฐํ
- ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋ ์ ํ
- ํด๋จ ๋ ธ๋๋ฅผ ๊ฑฐ์ณ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ๋น์ฉ์ ๊ณ์ฐํด ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ ๊ฐฑ์
- 3,4๋ฒ ๋ฐ๋ณต
- ๊ฐ ๋ ธ๋์ ๋ํ ํ์ฌ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ ์ ๋ณด๋ฅผ ํญ์ 1์ฐจ์ ํ ์ด๋ธ์ ์ ์ฅํ๋ฉฐ ์ด๋ฅผ ๊ฐฑ์ ํ๋ค๋ ์ ์ด ํน์ง
- ๊ตฌํ ๋ฐฉ๋ฒ
- ๊ฐ๋จํ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
- ์๊ฐ ๋ณต์ก๋: O(V^2) <V: ๋ ธ๋์ ๊ฐ์>
- ๊ฐ ๋ ธ๋์ ๋ํ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๋ด๋ 1์ฐจ์ ํ ์ด๋ธ ์ ์ธ
- ๋จ๊ณ๋ง๋ค ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ์ ํํ๊ธฐ ์ํด ๋งค ๋จ๊ณ๋ง๋ค 1์ฐจ์ ํ ์ด๋ธ์ ๋ชจ๋ ์์๋ฅผ ํ์ธ(์์ฐจ ํ์) ํ๋ค.
- ๊ฐ์ ๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
- ์๊ฐ ๋ณต์ก๋: O(ElogV) <V: ๋ ธ๋์ ๊ฐ์, E: ๊ฐ์ ์ ๊ฐ์>
- ํ(Heap) ์๋ฃ๊ตฌ์กฐ ์ฌ์ฉ
- ์ฐ์ ์์ ํ(Priority Queue)๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์๋ฃ๊ตฌ์กฐ
- ์ฐ์ ์์ ํ: ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฅ ๋จผ์ ์ญ์
- ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ์ฌ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ๋กํ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ ์ ์
- ๊ฐ๋จํ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ
- ๋งค ๋จ๊ณ๋ง๋ค ๋ชจ๋ ๊ฐ์ ์ ์ ๋ถ ํ์ธํ๋ฉด์ ๋ชจ๋ ๋ ธ๋ ๊ฐ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํจ
- ์์ ๊ฐ์ ์ด ์์ด๋ ์ต์ ์ ํด๋ฅผ ์ฐพ์ ์ ์์
- ์๊ฐ ๋ณต์ก๋ O(VE) <V: ๋ ธ๋์ ๊ฐ์,E: ๊ฐ์ ์ ๊ฐ์>
- ์ํ๊ณผ์
- ์ถ๋ฐ ๋ ธ๋ ์ค์
- ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ ์ด๊ธฐํ
- ๋ชจ๋ ๊ฐ์ E ๊ฐ๋ฅผ ํ๋์ฉ ํ์ธ
- ๊ฐ ๊ฐ์ ์ ๊ฑฐ์ณ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ๋น์ฉ์ ๊ณ์ฐํ์ฌ ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ ๊ฐฑ์
- 3,4๋ฒ ๊ณผ์ ์ V-1 ๋ฐ๋ณต
ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ
- ๋ชจ๋ ์ง์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ง์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ
- ๋งค ๋จ๊ณ๋ง๋ค ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค์์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ๋ ๋ ธ๋๋ฅผ ์ฐพ์ ํ์ ์์
- 2์ฐจ์ ํ ์ด๋ธ์ ์ต๋จ ๊ฑฐ๋ฆฌ ์ ๋ณด ์ ์ฅ
- ์๊ฐ ๋ณต์ก๋ O(N^3)
์ต๋จ ๊ฒฝ๋ก ๋ฌธ์
๋ฏธ๋ ๋์
๋ฐฉ๋ฌธ ํ๋งค์ A๋ ๋ง์ ํ์ฌ๊ฐ ๋ชจ์ฌ ์๋ ๊ณต์ค ๋ฏธ๋ ๋์์ ์๋ค.
๊ณต์ค ๋ฏธ๋ ๋์์๋ 1๋ฒ๋ถํฐ N๋ฒ ๊น์ง์ ํ์ฌ๊ฐ ์๋๋ฐ ํน์ ํ์ฌ๋ผ๋ฆฌ๋ ์๋ก ๋๋ก๋ฅผ ํตํด ์ฐ๊ฒฐ๋์ด ์๋ค.
๋ฐฉ๋ฌธ ํ๋งค์ A๋ ํ์ฌ 1๋ฒ ํ์ฌ์ ์์นํด ์์ผ๋ฉฐ X๋ฒ ํ์ฌ์ ๋ฐฉ๋ฌธํด ๋ฌผ๊ฑด์ ํ๋งคํ๊ณ ์ ํ๋ค.
ํน์ ํ์ฌ์ ๋์ฐฉํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ํ์ฌ๋ผ๋ฆฌ ์ฐ๊ฒฐ๋์ด ์๋ ๋๋ก๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด ์ ์ผํ๋ค.
๋ํ ์ฐ๊ฒฐ๋ 2๊ฐ์ ํ์ฌ๋ ์๋ฐฉํฅ์ผ๋ก ์ด๋ํ ์ ์์ผ๋ฉฐ, ํน์ ํ์ฌ์ ๋ค๋ฅธ ํ์ฌ๊ฐ ๋๋ก๋ก ์ฐ๊ฒฐ๋์ด ์๋ค๋ฉด, ์ ํํ 1๋งํผ์ ์๊ฐ์ผ๋ก ์ด๋ํ ์ ์๋ค.
๋ํ ์ค๋ A๋ ์๊ฐํ ์๋ ์ฐธ์ํ๊ณ ์ ํ๋ค.
์๊ฐํ ์๋๋ K๋ฒ ํ์ฌ์ ์กด์ฌํ๋ฉฐ, A๋ X๋ฒ ํ์ฌ์ ๊ฐ๊ธฐ ์ ์๊ฐํ ์๋๋ฅผ ๋ง๋๊ณ ์ ํ๋ค.
A๊ฐ ํ์ฌ ์ฌ์ด๋ฅผ ์ด๋ํ๊ฒ ๋๋ ์ต์ ์๊ฐ์ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๋น ๋ฅด๊ฒ ํ ์ ์๋ค.
1๋ฒ ๋ ธ๋์์ K๋ฅผ ๊ฑฐ์ณ X๋ก ๊ฐ๋ ์ต๋จ ๊ฑฐ๋ฆฌ๋ (1๋ฒ ๋ ธ๋์์ K๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ + K์์ X๊น์ง ์ต๋จ ๊ฑฐ๋ฆฌ) ์ด๋ค.
var input_data = readLine()!.split(separator: " ").map{Int(String($0))!}
var n = input_data[0], m = input_data[1]
var graph: [[Int]] = Array(repeating: Array(repeating: Int.max, count: n+1), count: n+1)
for i in 1..<n+1{
for j in 1..<n+1{
if i == j {
graph[i][j] = 0
}
}
}
//์๊ธฐ ์์ ์์ ์๊ธฐ ์์ ์ผ๋ก ๊ฐ๋ ๋น์ฉ์ 0์ผ๋ก ์ด๊ธฐํ
for _ in 0..<m{
var ab = readLine()!.split(separator: " ").map{Int(String($0))!}
graph[ab[0]][ab[1]] = 1
graph[ab[1]][ab[0]] = 1
}
var xk = readLine()!.split(separator: " ").map{Int(String($0))!}
var x = xk[0], k = xk[1]
//ํ๋ก์ด๋ ์์
์๊ณ ๋ฆฌ์ฆ ์ํ
for i in 1..<n+1{
for a in 1..<n+1{
for b in 1..<n+1{
if graph[a][i] < Int.max && graph[i][b] < Int.max{
graph[a][b] = min(graph[a][b], graph[a][i] + graph[i][b])
}
}
}
}
if graph[1][k] < Int.max && graph[k][x] < Int.max{
var distance = graph[1][k] + graph[k][x]
print(distance)
}else{
print("-1")
}
์ ๋ณด
์ด๋ค ๋๋ผ์๋ N๊ฐ์ ๋์๊ฐ ์์ผ๋ฉฐ, ๊ฐ ๋์๋ ๋ณด๋ด๊ณ ์ ํ๋ ๋ฉ์์ง๊ฐ ์๋ ๊ฒฝ์ฐ, ๋ค๋ฅผ ๋์๋ก ์ ๋ณด๋ฅผ ๋ณด๋ด์ ๋ค๋ฅธ ๋์์ ํด๋น ๋ฉ์์ง๋ฅผ ์ ์กํ ์ ์๋ค. ํ์ง๋ง X ๋์์์ Y๋์๋ก ์ ๋ณด๋ฅผ ๋ณด๋ด๊ณ ์ ํ๋ค๋ฉด, X์์ Y๋ก ํฅํ๋ ํต๋ก๊ฐ ์ค์น๋์ด ์์ด์ผ ํ๋ค.
ํต๋ก๋ฅผ ๊ฑฐ์ณ ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ๋๋ ์ผ์ ์๊ฐ์ด ์์๋๋ค.
์ด๋๋ C ๋์์์ ์๊ธ ์ํฉ์ด ๋ฐ์ํ๋ค. ๊ทธ๋์ ์ต๋ํ ๋ง์ ๋์๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ ์ ํ๋ค.
๋ฉ์์ง๋ C์์ ์ถ๋ฐํ์ฌ ๊ฐ ๋์ ์ฌ์ด์ ์ค์น๋ ํต๋ก๋ฅผ ๊ฑฐ์ณ, ์ต๋ํ ๋ง์ด ํผ์ ธ๋๊ฐ๊ฒ์ด๋ค.
๊ฐ ๋์์ ๋ฒํธ์ ํต๋ก๊ฐ ์ค์น๋์ด ์๋ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, ๋์ C์์ ๋ณด๋ธ ๋ฉ์์ง๋ฅผ ๋ฐ๊ฒ๋๋ ๋์์ ๊ฐ์๋ ์ด ๋ช๊ฐ ์ด๋ฉฐ, ๋์๋ค์ด ๋ชจ๋ ๋ฉ์์ง๋ฅผ ๋ฐ๋๋ฐ ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ผ๋ง์ธ์ง ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ์ง๋ง swift์์๋ ์ฐ์ ์์ ํ๋ฅผ ์ ๊ณตํ์ง ์์ ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ์์ฑํ์๋ค.
var input_data = readLine()!.split(separator: " ").map{Int(String($0))!}
var n = input_data[0], m = input_data[1], start = input_data[2]
var graph: [[[Int]]] = Array(repeating: Array(repeating: Array(repeating: 0, count: 0), count: 0), count: n+1)
var distance: [Int] = Array(repeating: Int.max, count: n+1)
for _ in 0..<m{
input_data = readLine()!.split(separator: " ").map{Int(String($0))!}
var x = input_data[0], y = input_data[1], z = input_data[2]
graph[x].append([y,z])
}
func dijkstra(_ start: Int){
var queue: [[Int]] = [[start, 0]]
distance[start] = 0
while !queue.isEmpty{
let first = queue.removeFirst()
if distance[first[0]] < first[1]{
continue
}
for i in graph[first[0]]{
var cost = first[1] + i[1]
if cost < distance[i[0]]{
distance[i[0]] = cost
queue.append([i[0],cost])
}
}
}
}
dijkstra(start)
var count = 0, max_distance = 0
for d in distance {
if d != Int.max{
count += 1
max_distance = max(max_distance, d)
}
}
print(count-1, max_distance)
๋ฐ์ํ
'๐ Computer Science > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ (0) | 2022.04.14 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ(Dynamic Programming) (0) | 2022.03.30 |
[์๊ณ ๋ฆฌ์ฆ] ์ด์ง ํ์(Binary Search) (0) | 2022.03.25 |
[์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ(Sorting) (0) | 2022.03.24 |
[์๊ณ ๋ฆฌ์ฆ] DFS/ BFS (0) | 2022.03.23 |