반응형
처음에는 플로이드 워셜 알고리즘을 모르는 상태에서 문제를 풀어보았다.
문제의 제한사항이나, 입력제한이 널널해서 그런지
다익스트라 여러번 돌려도 문제를 맞출 수 있었다.
import sys
from heapq import heappush,heappop
input = sys.stdin.readline
city = int(input().strip())
bus = int(input().strip())
graph = [[0 for i in range(city+1)] for j in range(city+1)] #간선의 정보들 저장
for i in range(bus):
fst,scd,thd = map(int,input().split())
if not graph[fst][scd]:
graph[fst][scd] = thd
else: #가중치가 더 적은 간선 저장
if graph[fst][scd]>thd:
graph[fst][scd] = thd
def fw(start):
dis = [1e9 for i in range(city+1)]
dis[start] = 0
que = [(0,start)]
while que:
curlen,curx = heappop(que)
for i in range(1,city+1):
if graph[curx][i]:
if dis[i]>curlen+graph[curx][i]:
dis[i]=curlen+graph[curx][i]
heappush(que,(dis[i],i))
return dis
for i in range(1,city+1): #1번 노드부터 다익스트라 시작점으로 거리 계산하기
rst = fw(i)[1:]
for j in range(city):
if rst[j] == 1e9:
rst[j]= 0
print(*rst) #그때마다 출력
그러나 효율성을 생각해서 플로이드 워셜알고리즘이 적용된 문제 풀이도 찾아보게 되었다.
인덱싱이 상당히 직관적으로 구현되어 있었다.
| fmti0720님의 풀이 |
더보기
import sys
input = sys.stdin.readline
INF = sys.maxsize
n = int(input())
m = int(input())
rs = [[INF] *(n+1) for _ in range(n+1)]
for i in range(1, n+1):
rs[i][i] = 0
for i in range(m):
a,b,c = map(int, input().split())
rs[a][b] = min(rs[a][b], c)
for k in range(1, n+1): # 거치는 값
for j in range(1, n+1): # 시작
for i in range(1, n+1): # 도착
if rs[j][i] > rs[j][k] + rs[k][i]:
rs[j][i] = rs[j][k] + rs[k][i]
for j in range(1, n+1):
for i in range(1, n+1):
if rs[j][i] == INF: print(0, end=' ')
else: print(rs[j][i], end = ' ')
print()
다시 풀어보니 왜 중간지점(거치는 값)이 바깥쪽에 와야하는지 한참을 고민했다.
결국 다른 사람 블로그를 찾아보니
https://scieneer.tistory.com/19
플로이드 와샬 (Floyd - Warshall)
플로이드 와샬 알고리즘은 최단경로 알고리즘중 하나이다. 정점 V개가 있고 거리가 다 주어져 있을 때 단 한 번의 시행으로 모든 정점 쌍 사이의 거리를 다 구해낸다. 3중 for문으로 구성되어있으
scieneer.tistory.com
중간지점 거치는 값은 중간지점을 지난 갯수로도 해석이 될 수 있다는 것이었다!
그래서 같은 중간지점 갯수를 지난 노드와 비교를 해야 옳바르게 비교가 가능하다는 것이었다.
중간지점 값이 커질 수록 그 작은 중간지점을 거친 값은 이미 반영되어 있다.
반응형
'알고리즘 문제들 으악 > 백준' 카테고리의 다른 글
| [python]9095번 1,2,3 더하기 (0) | 2023.01.18 |
|---|---|
| [python]11726번 2×n 타일링, 문제 속 알고리즘 파악 (0) | 2023.01.17 |
| [python]11657번 타임머신,벨만 포드 알고리즘 (0) | 2023.01.15 |
| [python]🔥🔥2293번 동전 1 (0) | 2023.01.14 |
| [python]🔥🔥🔥2302번 극장 좌석 (0) | 2023.01.12 |