Thief of Wealth
Published 2020. 9. 28. 02:15
11403 경로 찾기 개발/알고리즘

www.acmicpc.net/problem/11403

 

11403번: 경로 찾기

가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 경로가 있는지 없는지 구하는 프로그램을 작성하시오.

www.acmicpc.net

 

모든 지점에서 모든 경로에 대한 최소거리를 구하는 알고리즘은 플로이드 워셜 알고리즘이다.

 

O(N^3) 인 특징이 있으며 DP이다.

 

가장 중요한 부분인 3중 반복문 구문을 헷갈리면 안된다.

for i in range(n):
  for j in range(n):
    for k in range(n):
      if(graph[i][k]+graph[k][j] == 2 or graph[i][j] != 0):
        graph[i][j] = 1
for k in range(n):
  for i in range(n):
    for j in range(n):
      if(graph[i][k]+graph[k][j] == 2 or graph[i][j] != 0):
        graph[i][j] = 1

 

위 두 코드중 2번째 것이 플로이드 워셜 알고리즘이다. 거쳐가는 경로인 k가 최고 상위 반복문의 변수여야 한다.

이것을 헷갈려서 고민했던 문제였다.

 

import sys
input = sys.stdin.readline

n = int(input())
graph = []
answer = []
for _ in range(n):
  graph.append( list(map(int,input().rstrip().split(" ") )))

for k in range(n):
  for i in range(n):
    for j in range(n):
      if(graph[i][k]+graph[k][j] == 2 or graph[i][j] != 0):
        graph[i][j] = 1


for i in graph:
  print(" ".join( map(str,i) ))

'개발 > 알고리즘' 카테고리의 다른 글

11404 플로이드  (0) 2020.09.29
1389 케빈 베이컨의 6단계 법칙  (0) 2020.09.29
플로이드 워셜 알고리즘  (0) 2020.09.28
11052 카드 구매하기  (0) 2020.09.28
14501 퇴사  (0) 2020.09.26
profile on loading

Loading...