A에서 B로 가는 최소 비용
과 A에서 K를 거쳐 B로 가는 비용
을 비고하여 더 작은 값으로 갱신하겠다는 것 입니다. 즉, 바로 이동하는 거리
가 특정한 노드를 거쳐서 이동하는 거리
보다 더 많은 비용을 가진다면 이를 더 짧은 것으로 갱신합니다. [i][j]
는 노드 i에서 노드 j로 가는 최단 경로의 길이를 나타냅니다. 자기 자신으로의 경로는 0으로 설정하고, 직접 연결되지 않은 노드 쌍의 거리는 무한대로 설정합니다. [i][k] + [k][j] < [i][j]
이면 [i][j]
를 새로운 경로 길이로 갱신합니다. import Foundation
let testCase = readLine()!.components(separatedBy: " ").map { Int($0)! }
let N = testCase[0]
let M = testCase[1]
// Int.max로 하면 arithmetic overflow 발생한다.
let INF = 10001
var graph = [[Int]](repeating: [Int](repeating: INF, count: N), count: N)
// 자기 자신으로 가는 비용 0으로 초기화
for i in 0..<N {
for j in 0..<N {
if i == j {
graph[i][j] = 0
}
}
}
// 최초 2차원 리스트의 값은 무한으로 초기화하며, 각 간선에 대한 값으로 초기화 한다.
for _ in 0..<M {
let testCase = readLine()!.components(separatedBy: " ").map { Int($0)! }
graph[testCase[0] - 1][testCase[1] - 1] = testCase[2]
}
for k in 0..<N {
for i in 0..<N {
for j in 0..<N {
graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j])
}
}
}
// 또는 Int.max를 사용할 경우 INF보다 작을때만 작동할수있도록 설정하면 된다.
for k in 0..<N {
for i in 0..<N {
for j in 0..<N {
if graph[i][k] < INF && graph[k][j] < INF {
let newDistance = graph[i][k] + graph[k][j]
if newDistance < graph[i][j] {
graph[i][j] = newDistance
}
}
}
}
}
[1][k]
와 [k][x]
의 값을 더해주면 된다. import Foundation
let testCase = readLine()!.components(separatedBy: " ").map { Int($0)! }
let N = testCase[0]
let M = testCase[1]
// Int.max로 하면 arithmetic overflow 발생한다.
let INF = 10001
var graph = [[Int]](repeating: [Int](repeating: INF, count: N), count: N)
// 자기 자신으로 가는 비용 0으로 초기화
for i in 0..<N {
for j in 0..<N {
if i == j {
graph[i][j] = 0
}
}
}
// 최초 2차원 리스트의 값은 무한으로 초기화하며, 각 간선에 대한 값으로 초기화 한다.
for _ in 0..<M {
let testCase = readLine()!.components(separatedBy: " ").map { Int($0)! }
graph[testCase[0] - 1][testCase[1] - 1] = 1
graph[testCase[1] - 1][testCase[0] - 1] = 1
}
let XandK = readLine()!.components(separatedBy: " ").map { Int($0)! }
for k in 0..<N {
for i in 0..<N {
for j in 0..<N {
graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j])
}
}
}
let result = graph[0][XandK[1] - 1] + graph[XandK[1] - 1][XandK[0] - 1]
if result >= INF {
print(-1)
} else {
print(result)
}
5
14
1 2 2
1 3 3
1 4 1
1 5 10
2 4 2
3 4 1
3 5 1
4 5 3
3 5 10
3 1 8
1 4 2
5 1 7
3 4 2
5 2 4
0 2 3 1 4
12 0 15 2 5
8 5 0 1 1
10 7 13 0 3
7 4 10 6 0
시작 도시와 도착 도시를 연결하는 노선은 하나가 아닐 수 있다.
이다. 즉, 최소 값을 구해야하는데, 해당 값이 최초 최소값보다 큰 값이 들어갈 수 있다는 말이다. import Foundation
// 도시의 개수
let N = Int(readLine()!)!
// 버스의 개수
let M = Int(readLine()!)!
// Int.max로 하면 arithmetic overflow 발생한다.
let INF = Int.max
var graph = [[Int]](repeating: [Int](repeating: INF, count: N), count: N)
// 자기 자신으로 가는 비용 0으로 초기화
for i in 0..<N {
for j in 0..<N {
if i == j {
graph[i][j] = 0
}
}
}
// 최초 2차원 리스트의 값은 무한으로 초기화하며, 각 간선에 대한 값으로 초기화 한다.
for _ in 0..<M {
let testCase = readLine()!.components(separatedBy: " ").map { Int($0)! }
let to = testCase[0] - 1
let destination = testCase[1] - 1
let weight = testCase[2]
if graph[to][destination] > weight {
graph[to][destination] = weight
}
}
for k in 0..<N {
for i in 0..<N {
for j in 0..<N {
// INF를 Int.max로 해줘서 해당 조건문 생성 [i][k], [k][j] 둘 다 INF보다 작아야함
// 즉, 둘 중 하나라도 INF 값이면 무시
if graph[i][k] < INF && graph[k][j] < INF {
let newDistance = graph[i][k] + graph[k][j]
if newDistance < graph[i][j] {
graph[i][j] = newDistance
}
}
}
}
}
for i in 0..<N {
for j in 0..<N {
if graph[i][j] == INF {
graph[i][j] = 0
}
print(graph[i][j],terminator: " ")
}
print()
}
5 5
1 2
1 3
2 3
3 4
2 4
3
1 5
2 4
3 1
0
-1
1
1
의 가중치를 부여하고, 플로이드 워셜 알고리즘을 활용해서 모든 최단거리에 대해 가중치 값을 최신화 해주면 된다. import Foundation
let testCase = readLine()!.components(separatedBy: " ").map { Int($0)! }
// 사건의 개수
let N = testCase[0]
// 전후 관계의 개수
let K = testCase[1]
let INF = 100000
// 최초 무제한 값으로 초기화
var graph = [[Int]](repeating: [Int](repeating: INF, count: N), count: N)
// 자기 자신으로 가는 비용 0으로 초기화
for i in 0..<N {
for j in 0..<N {
if i == j {
graph[i][j] = 0
}
}
}
// 최초 2차원 리스트의 값은 무한으로 초기화하며, Edge가 있는 각 간선에 대해 1로 초기화
for _ in 0..<K {
let testCase = readLine()!.components(separatedBy: " ").map { Int($0)! }
let to = testCase[0] - 1
let destination = testCase[1] - 1
let weight = 1
graph[to][destination] = weight
}
for k in 0..<N {
for i in 0..<N {
for j in 0..<N {
if graph[i][k] < INF && graph[k][j] < INF {
let newDistance = graph[i][k] + graph[k][j]
if newDistance < graph[i][j] {
graph[i][j] = newDistance
}
}
}
}
}
// 유추가 불가능할 때는 0을 나타내기 위해 INF을 '0'으로 초기화
for i in 0..<N {
for j in 0..<N {
if graph[i][j] == INF {
graph[i][j] = 0
}
}
}
let testResult = Int(readLine()!)!
for _ in 0..<testResult {
let testCase = readLine()!.components(separatedBy: " ").map { Int($0)! }
let i = testCase[0] - 1
let j = testCase[1] - 1
if graph[i][j] > graph[j][i] {
print("-1")
} else if graph[i][j] < graph[j][i] {
print("1")
} else {
print("0")
}
}
제가 학습한 내용을 요약하여 정리한 것입니다. 내용에 오류가 있을 수 있으며, 어떠한 피드백도 감사히 받겠습니다.
감사합니다.