본문으로 바로가기


[  BAEKJOON ONLINE JUDGE  ]


11404 플로이드 _ Python 파이썬


 

1. 문제

 

 

입력 예시 출력 예시
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

www.acmicpc.net/problem/11404 

 

11404번: 플로이드

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

www.acmicpc.net


 

2. 아이디어

 

이 문제는 플로이드 워셜 알고리즘을 이용한 가장 기초 문제이다.

이에 대한 개념은 아래 게시글에 정리해두었다.

 

플로이드 워셜 개념

codingexplore.tistory.com/53

 

[ 알고리즘 개념 ] 플로이드 워셜 알고리즘 (Floyd-Warshall Algorithm)

플로이드 워셜 알고리즘 (Floyd-Warshall Algorithm) 1. 개념 플로이드 워셜 알고리즘은 '모든 지점에서 다른 모든 지점' 까지의 최단경로를 모두 구해야 하는 경우에 사용한다. '한 지점' 에서 나머지

codingexplore.tistory.com

플로이드 워셜 구현

codingexplore.tistory.com/54

 

[ 알고리즘 개념 ] 플로이드 워셜 알고리즘 (Floyd-Warshall Algorithm) 구현 - 파이썬(Python)

플로이드 워셜 알고리즘 (Floyd-Warshall Algorithm) 구현 - 파이썬(Python) ↓ 플로이드 워셜 알고리즘에 대한 개념은 이전 게시글에 정리해두었다. codingexplore.tistory.com/53 [ 알고리즘 개념 ] 플로..

codingexplore.tistory.com

 




3. 코드

 

위 정리 게시글의 코드 그대로 사용하면 당연히 틀린다.

 

틀리는 원인 1. 문제조건 "만약, i에서 j로 갈 수 없는 경우에는 그 자리에 0을 출력한다." 를 무시했을 경우

 

틀리는 원인 2. 그래프 초기화 실수

- 입력 예시를 보면 이 문제에서는 A->B 로 갈 수 있는 여러 간선이 존재할 수 있다.

 

- 따라서 초기화 시 입력받은걸 무조건 할당하면 안된다.

- 19~20 라인의 코드를 보면, 현재 dist 값보다 더 작을 경우에만 새로 갱신하여 초기화한다.

 

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
# 플로이드
import sys
input = sys.stdin.readline
INF = int(1e9)
 
= int(input()) # 노드의 개수
= int(input()) # 간선의 개수
 
graph = [[INF] * (n + 1for _ in range(n + 1)] # 최단거리 테이블
 
for s in range(1, n + 1):
    for e in range(1, n + 1):
        if s == e: # 그래프의 시작지점 == 도착지점
            graph[s][e] = 0 # 거리 0으로 초기화
 
# S0 : 그래프 초기화
for _ in range(m):
    s, e, dist = map(int, input().split())
    if graph[s][e] > dist:
        graph[s][e] = dist
 
# S1 ~ SN : 모든 노드를 돌며 각 노드를 거치는 모든 경로 검토
for node in range(1, n + 1): # 노드에 대한 루프
    for s in range(1, n + 1): # 2차원 그래프 루프
        for e in range(1, n + 1):
            graph[s][e] = min(graph[s][e], graph[s][node] + graph[node][e])
 
# 출력
for s in range(1, n + 1):
    for e in range(1, n + 1):
        if graph[s][e] == INF:
            print("0", end = ' ')
        else:
            print(graph[s][e], end = ' ')
    print()
cs

 

 

 

 

반응형