youngjaeLee1026
2022. 4. 16. 17:08
1. λ¬Έμ
2. μ μΆλ ₯
3. μ μΆλ ₯ μμ
4. λ¬Έμ μ€κ³
- λ¬Έμ μμ μλ°©ν₯ λλ‘κ° μλμ μ£ΌμνλΌλ μ μ κ³ λ €νμ¬, λ¨λ°©ν₯ κ·Έλνλ₯Ό ꡬμ±νκ³ κ·Έ κ·Έλνμ λν μλ°©ν₯ κ·Έλνλ₯Ό ꡬμ±ν ν
- μ² μλ€ μ§μ λνμ¬ λ κ·Έλνμ λν΄ λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦μ μ μ©νκ² λλ©΄, λͺ¨λ λ§μ μ¬λλ€μ΄ μ² μλ€ μ§μ μ€κ³ κ°λ μ΅λ¨ κ²½λ‘λ₯Ό λͺ¨λ ꡬν μ μμ
- λ°λΌμ λ κ·Έλνμ λν λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦μ μ μ©ν ν, λ μ΅λ¨ 거리 λ°°μ΄μ λͺ¨λ μμμ ν©μ λν΄μ€μΌλ‘μ¨ λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ
5. μ 체 μ½λ
//MARK: - νν°
//MARK: - Framework
import Foundation
//MARK: - Type
struct Graph {
//MARK: - Property
var edges, costs: [Int]
//MARK: - Initializer
init() {
self.edges = []
self.costs = []
}
}
//MARK: - Function
func dijkstra(_ graph: [Graph], _ N: Int, _ K: Int) -> Int {
var visited: [Bool] = Array(repeating: false, count: N + 10)
var distances: [Int] = Array(repeating: 987987987, count: N + 10)
var sum: Int = 0
distances[K] = 0
for _ in stride(from: 1, through: N, by: 1) {
var minCost, minIndex: Int
minCost = 987987987
minIndex = -1
for j in stride(from: 1, through: N, by: 1) {
if !visited[j] && minCost > distances[j] {
minCost = distances[j]
minIndex = j
}
}
visited[minIndex] = true
for j in 0..<graph[minIndex].edges.count {
let y: Int = graph[minIndex].edges[j]
let cost: Int = graph[minIndex].costs[j]
if distances[y] > distances[minIndex] + cost {
distances[y] = distances[minIndex] + cost
}
}
}
for i in stride(from: 1, through: N, by: 1) {
sum += distances[i]
}
return sum
}
func solution() -> Void {
//MARK: - Input
guard let input: [String] = readLine()?.components(separatedBy: " ") else { return }
let N: Int = input.map { Int($0) }[0] ?? 0
let M: Int = input.map { Int($0) }[1] ?? 0
let K: Int = input.map { Int($0) }[2] ?? 0
var result: Int = 0
var graphOne: [Graph] = Array(repeating: Graph(), count: N + 10)
var graphTwo: [Graph] = Array(repeating: Graph(), count: N + 10)
for _ in 0..<M {
guard let inputData: [String] = readLine()?.components(separatedBy: " ") else { return }
let a: Int = inputData.map { Int($0) }[0] ?? 0
let b: Int = inputData.map { Int($0) }[1] ?? 0
let c: Int = inputData.map { Int($0) }[2] ?? 0
graphOne[a].edges.append(b)
graphTwo[b].edges.append(a)
graphOne[a].costs.append(c)
graphTwo[b].costs.append(c)
}
//MARK: - Process
result = dijkstra(graphOne, N, K) + dijkstra(graphTwo, N, K)
//MARK: - Output
print(result)
}
solution()
μ 체μ½λλ μ¬κΈ°μμ νμΈν μ μμ΅λλ€.