본문 바로가기
코딩테스트 문제풀이/beakjoon

[백준] 11404 플로이드

by merona99 2022. 6. 29.
반응형

백준 11404번 플로이드

그래프 이론 / 플로이드 워셜

 

 

[문제]

 

 

모든 도시의 최단거리 출력문제이므로 한점에서 이동하는 다익스트라보다는 플로이드 워셜이 더 알맞다.

 

 

입출력 예시)

'1 4 1'과 '1 4 2'가 서로 경로가 겹치는 것이 보인다.

해당 경우에 거리비용이 더 작은 것으로 갱신하는 작업이 별도로 필요하다.

 

 

 

[과정]

 

플로이드 알고리즘은 약간 dfs/bfs + dp 문제인 것 같다.

점화식을 사용해서 2중 반복문을 사용하면 다익스트라보다 쉽게 구현할 수 있다.

 

  • 거리 2차원 배열(graph)을 최대값(1e9)로 초기화
  • 2중 반복문으로 자기자신의 경로는 0으로 초기화
  • 간선정보를 저장
  • 해당 그래프 좌표의 거리비용과 모든 경우의 수의 거리비용 중 최솟값으로 해당 좌표의 거리비용(graph[a][b])을 갱신
  • graph 출력

 

 

 

[소스코드]

 

# 플로이드  2022-06-28

import sys
input = sys.stdin.readline

INF = int(1e9)
n = int(input())
m = int(input())

graph = [[INF] * (n+1) for _ in range(n+1)]

# 자기자신 비용 0으로 초기화
for i in range(1, n+1):
    for j in range(1, n+1):
        if i == j:
            graph[i][j] = 0

# 간선정보 입력
for i in range(m):
    a,b,c = map(int, input().split())
    graph[a][b] = min(graph[a][b], c)

# 플로이드 워셜 알고리즘 수행
for k in range(1, n+1):
    for a in range(1, n+1):
        for b in range(1, n+1):
            graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b])

# 수행된 결과 출력
for a in range(1, n+1):
    for b in range(1, n+1):
        if graph[a][b] == INF:
            print("0", end=" ")
        else:
            print(graph[a][b], end=" ")
    print()

import sys가 없다면 시간초과가 뜬다.

 


 

 

[통과]

아래 둘다 코드는 동일한데 처음은 print()문을 안지워서, 두번째는 import sys를 안적어서 오류!

 

반응형

'코딩테스트 문제풀이 > beakjoon' 카테고리의 다른 글

[백준] 18353 병사 배치하기  (0) 2022.06.29
[백준] 14501 퇴사  (0) 2022.06.29
[백준] 1932 정수 삼각형  (0) 2022.06.21
[Flipkart] 금광  (0) 2022.06.19
[백준] 2110 공유기 설치  (0) 2022.06.17

댓글