본문 바로가기
알고리즘

[Swift] 백준 - 플로이드

by 고고 2022. 2. 7.

문제: https://www.acmicpc.net/problem/11404

 

11404번: 플로이드

첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가

www.acmicpc.net

 

import Foundation

let INF = Int.max // 무한을 의미하는 값

// 노드의 개수, 간선의 개수를 입력받기
let n = Int(readLine()!)!
let m = Int(readLine()!)!
// 2차원 리스트(그래프 표현)를 만들고, 모든 값을 무한으로 초기화
var graph = Array(repeating: Array(repeating: INF, count: n + 1), count: n + 1)

// 자기 자신에서 자기 자신으로 가는 비용은 0으로 초기화
for a in 1...n {
    graph[a][a] = 0
}

// 각 간선에 대한 정보를 입력 받아, 그 값으로 초기화
for _ in 1...m {
    let edge = readLine()!.split(separator: " ").map { Int($0)! }
    graph[edge[0]][edge[1]] = min(graph[edge[0]][edge[1]], edge[2])
}

// 점화식에 따라 플로이드 워셜 알고리즘을 수행
for k in 1...n {
    for a in 1...n {
        for b in 1...n {
            if a != b {
                if graph[a][k] != INF && graph[k][b] != INF{
                    graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b])
                }
            }
        }
    }
}

// 수행된 결과를 출력
for a in 1...n {
    for b in 1...n {
        // 도달할 수 없는 경우
        if graph[a][b] == INF {
            print("0", terminator: " ")
        } else {
            // 도달할 수 있는 경우 거리를 출력
            print(graph[a][b], terminator: " ")
        }
    }
    print()
}

'알고리즘' 카테고리의 다른 글

[Swift] 다익스트라 - 최소 힙 코드  (0) 2022.02.07
[Swift] 힙 코드  (0) 2022.02.07
[Swift] 백준 정수 삼각형  (0) 2022.02.04
[Swift] 순열 조합  (0) 2022.02.03
[Swift] 백준 - 부분 수열의 합  (0) 2022.02.03

댓글