공부/코딩테스트

[알고리즘] 플로이드 워셜

ghhong 2022. 6. 12. 20:27

각 단계마다 특정한 노드 k를 거쳐가는 경우를 확인한다. a에서 b로 가는 경로보다 a에서 k를 거쳐 b로 가는 경로가 더 빠른지를 검사한다.

INF=int(1e9) #무한을 의미
n=int(input()) #노드의 개수
m=int(input()) #간선의 개수
graph=[[INF]*(n+1) for _ in range(n+1)] #2차원 리스트를 만들고 무한으로 초기화

for a in range(1,n+1):
  for b in range(1, n+1):
    if a==b:
      graph[a][b]=0 #자기자신으로 가는 비용

for _ in range(m): #간선 정보 입력받기
  a,b,c = map(int,input().split())
  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]) #k를 거쳐가는 값이 더 작으면 바꿈

for a in range(1, n+1):
  for b in range(1, n+1):
    #경로가 없는 경우
    if graph[a][b]==INF:
      print("infinity")
    else:
      print(graph[a][b], end=" ")
    print()

 

시간복잡도 : O(N^3)

=> 노드의 개수가 500개 미만일 때 사용.

 

 

문제 - 미래도시

INF = int(1e9)

n, m = map(int,input().split())
graph=[[INF]*(n+1) for i in range(n+1)]
for a in range(n+1):
  for b in range(n+1):
    graph[a][b] = 0

for _ in range(m):
  a, b= map(int,input().split())
  graph[a][b] =1
  graph[b][a] =1

x, k = map(int,input().split())

for k in range(1,n+1):
  for i in range(1, n+1):
    for j in range(1, n+1):
      graph[i][j] = max(graph[i][j],graph[i][k]+graph[k][j])

d = graph[1][k] + graph[k][x]
if d!=INF:
  print(d)
else:
  print(-1)

'공부 > 코딩테스트' 카테고리의 다른 글

[알고리즘] dp  (0) 2022.06.14
[알고리즘] 이진탐색  (0) 2022.06.13
[알고리즘] 다익스트라 최단거리 알고리즘  (0) 2022.06.12
[알고리즘] DFS, BFS  (0) 2022.06.05
[프로그래머스] 숫자의 표현(파이썬)  (0) 2022.03.21