본문 바로가기
Algorithm/Baekjoon

11404. 플로이드 (Swift, Python)

by 원만사 2021. 11. 12.
반응형

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

 

11404번: 플로이드

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

www.acmicpc.net

 

풀이 

 플로이드 워셜 알고리즘을 적용하는 문제. 모든 도시에서 다른 모든 도시까지의 최단거리를 구해준다.

 간단하게 플로이드 워셜 알고리즘을 적용하면 되는데 문제에서 주어진 '시작 도시와 도착 도시를 연결하는 노선은 하나가 아닐 수 있다.'만 주의하면 된다. a에서 b로 가는 도시의 노선이 여러개 주어질 수 있는데 그 중 가장 적은 비용이 드는 노선을 배열에 설정해줘야 한다. 

 

코드

[Swift]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
let INF: Int = Int(1e9)
 
var N: Int = 0 // 도시의 개수
var M: Int = 0 // 버스의 개수
 
// 도시 개수 입력
if let input = readLine() {
    N = Int(input)!
}
 
// 버스 개수 입력
if let input = readLine() {
    M = Int(input)!
}
 
// a에서 b로 가는데 필요한 비용
var graph: [[Int]] = Array(repeating: Array(repeating: INF, count: N + 1), count: N + 1)
 
// i에서 i의 경우 0으로 설정
for i in 1...N {
    graph[i][i] = 0
}
 
// 버스 정보 입력
for _ in 0..<M {
    if let input = readLine() {
        let inputs = input.split(separator: " ").map { Int($0)! }
        let a: Int = inputs[0]
        let b: Int = inputs[1]
        let c: Int = inputs[2]
        
        // 문제에서 시작 도시와 도착 도시를 연결하는 노선이 하나가 아닐 수 있다고 주어짐
        // 그렇기 때문에 a에서 b로 가는 노선이 여러개 주어질 경우 graph 배열에 최솟값을 넣어주도록 설정
        graph[a][b] = min(graph[a][b], c)
    }
}
 
// 플로이드 워셜 알고리즘 수행
for k in 1...N {
    for i in 1...N {
        for j in 1...N {
            graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j])
        }
    }
}
 
// 출력
for i in 1...N {
    for j in 1...N {
        if graph[i][j] == INF {
            print(0, terminator: " ")
        } else {
            print(graph[i][j], terminator: " ")
        }
    }
    print()
}
 
cs

 

[Python]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
INF = int(1e9)
 
if __name__ == '__main__':
    n = int(input()) # 도시의 개수
    m = int(input()) # 버스의 개수
 
    # a에서 b로 가는데 필요한 비용을 담아두는 graph 리스트
    graph = [[INF] * (n+1for _ in range(n+1)]
 
    # i에서 i로 가는 비용은 0으로 설정
    for i in range(1, n+1):
        graph[i][i] = 0
    
    # 버스 노선 정보 입력
    for _ in range(m):
        a, b, c = map(int, input().split())
 
        # 문제에서 시작 도시와 도착 도시를 연결하는 노선이 하나가 아닐 수 있다고 주어짐
        # 그렇기 때문에 a에서 b로 가는 노선이 여러개 주어질 경우 graph 리스트에 최솟값을 넣어주도록 설정
        if c < graph[a][b]:
            graph[a][b] = c
    
    # 플로이드 워셜 알고리즘 수행
    for k in range(1, n+1):
        for i in range(1, n+1):
            for j in range(1, n+1):
                graph[i][j] = min(graph[i][j] , graph[i][k] + graph[k][j])
    
    # 출력
    for i in range(1, n+1):
        for j in range(1, n+1):
            if graph[i][j] == INF:
                print(0, end=' ')
            else:
                print(graph[i][j], end=' ')
        print()
 
cs
반응형

'Algorithm > Baekjoon' 카테고리의 다른 글

1068. 트리 (Swift, Python)  (0) 2021.12.02
1738. 골목길 (Swift, Python)  (0) 2021.11.18
15422. Bumped! (Python)  (0) 2021.11.16
11657. 타임머신 (Swift, Python)  (0) 2021.11.14
(BOJ) 2644_촌수계산_JAVA  (0) 2020.08.11

댓글