[白俊11403]道を探せ❗

5095 ワード

https://www.acmicpc.net/problem/11403

🥚質問する



🥚入力/出力



🍳コード#コード#

import sys
input = sys.stdin.readline

n = int(input().strip())
g = [list(map(int, input().split())) for _ in range(n)]

# Floyd Warshall
# i -> k번 노드 -> j 로 거쳐가는 경로를 확인한다
for k in range(n):
    for i in range(n):
        for j in range(n):
            if g[i][j] == 1 or (g[i][k] == 1 and g[k][j] == 1):
                g[i][j] = 1
                """
                어차피 g[i][j] = 1로 갱신하기 때문에
                사실 g[i][j] == 1인 경우는 검사 안하고 넘어가도 됨
                그러나 이해를 위해 if문에서 검사하기로!
                """

# 출력
for row in g:
    for x in row:
        print(x, end=' ')
    print()

🧂アイデア


Floyd-Warshallアルゴリズム

  • i番ノード->k番ノード->j番ノードのパス
  • を確認します.
  • の問題において、経路が存在する場合は(i,j)直接接続、(i,k)->(k,j)
  • パスが存在する場合、値は1に更新されます.