Skip to content

Commit bf02e45

Browse files
Merge pull request #131 from HmmCorn/json
최단경로
2 parents 49ccdfa + b4e0a04 commit bf02e45

1 file changed

Lines changed: 89 additions & 0 deletions

File tree

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
let ve = readLine()!.split(separator: " ").compactMap { Int($0) }
2+
let (v, e) = (ve[0], ve[1])
3+
let k = Int(readLine()!)!
4+
var graph = [[(w: Int, v: Int)]](repeating: [], count: v + 1)
5+
6+
for _ in 0..<e {
7+
let input = readLine()!.split(separator: " ").compactMap { Int($0) }
8+
graph[input[0]].append((input[2], input[1]))
9+
}
10+
11+
var dists = [Int](repeating: Int.max, count: v + 1)
12+
var heap = Heap<(w: Int, v: Int)> { $0.w < $1.w }
13+
heap.push((0, k))
14+
dists[k] = 0
15+
16+
while let (curDist, curValue) = heap.pop() {
17+
guard dists[curValue] == curDist else { continue }
18+
19+
for (nextWeight, nextValue) in graph[curValue] {
20+
let nextDist = curDist + nextWeight
21+
if nextDist < dists[nextValue] {
22+
heap.push((nextDist, nextValue))
23+
dists[nextValue] = nextDist
24+
}
25+
}
26+
}
27+
28+
for i in 1...v {
29+
let dist = dists[i]
30+
print(dist == Int.max ? "INF" : dist)
31+
}
32+
33+
struct Heap<T> {
34+
var elements: [T]
35+
let priority: (T, T) -> Bool
36+
37+
var isEmpty: Bool { elements.isEmpty }
38+
var count: Int { elements.count }
39+
40+
init(_ priority: @escaping (T, T) -> Bool) {
41+
self.elements = []
42+
self.priority = priority
43+
}
44+
45+
mutating func push(_ element: T) {
46+
elements.append(element)
47+
siftUp(from: elements.count - 1)
48+
}
49+
50+
mutating func pop() -> T? {
51+
guard !elements.isEmpty else { return nil }
52+
elements.swapAt(0, elements.count - 1)
53+
let removed = elements.removeLast()
54+
siftDown(from: 0)
55+
return removed
56+
}
57+
58+
private mutating func siftUp(from index: Int) {
59+
var newIndex = index
60+
var parent = (index - 1) / 2
61+
62+
while newIndex > 0 && priority(elements[newIndex], elements[parent]) {
63+
elements.swapAt(newIndex, parent)
64+
newIndex = parent
65+
parent = (newIndex - 1) / 2
66+
}
67+
}
68+
69+
private mutating func siftDown(from index: Int) {
70+
var parent = index
71+
72+
while true {
73+
let left = parent * 2 + 1
74+
let right = parent * 2 + 2
75+
var candidate = parent
76+
77+
if left < elements.count && priority(elements[left], elements[parent]) {
78+
candidate = left
79+
}
80+
if right < elements.count && priority(elements[right], elements[candidate]) {
81+
candidate = right
82+
}
83+
84+
guard candidate != parent else { break }
85+
elements.swapAt(candidate, parent)
86+
parent = candidate
87+
}
88+
}
89+
}

0 commit comments

Comments
 (0)