Module: 플로이드 알고리즘


Problem

4 /10


가장 짧은 길

Theory Click to read/hide

그래프에 음의 가중치 주기가 있는 경우 공식적으로 Floyd-Warshall 알고리즘은 이러한 그래프에 적용할 수 없습니다.

실제로 음의 가중치 주기를 입력할 수 없는 정점 i와 j의 쌍에 대해 알고리즘이 올바르게 작동합니다.

답이 없는 동일한 정점 쌍에 대해(그들 사이의 경로에 음의 순환이 존재하기 때문에) Floyd의 알고리즘은 답으로 일부 숫자(매우 음수일 수 있지만 반드시 그런 것은 아님)를 찾습니다. 그러나 Floyd의 알고리즘은 이러한 정점 쌍을 깔끔하게 처리하고 예를 들어 \(- \infty\)를 출력하도록 개선될 수 있습니다.

이를 위해 예를 들어 다음과 같은  기준"경로의 존재하지 않음'을 수행할 수 있습니다. 따라서 일반적인 Floyd 알고리즘이 이 그래프에서 작동하도록 합니다. 그런 다음 i에서 도달할 수 있는 정점 t가 있고 j가 도달할 수 있는 경우에만 정점 i와 j 사이에 최단 경로가 없습니다.  \(d [t][t]<0\).

또한 음의 주기가 있는 그래프에 대해 Floyd의 알고리즘을 사용할 때 작업 과정에서 발생하는 거리가 음수로, 각 단계에서 기하급수적으로 갈 수 있음을 기억해야 합니다. 따라서 아래로부터의 모든 거리를 특정 값으로 제한하여 정수 오버플로에 주의해야 합니다(예:  \(- \infty\)).

솔루션은 다음과 같이 설명할 수 있습니다.
Floyd-Warshall 알고리즘이 입력 그래프에 대해 작동한 후 모든 정점 쌍에 대해 \((i,j)\), 그리고 이러한 각 쌍에 대해 반복하겠습니다. 무한히 i에서 j까지의 최단 경로가 작은지 아닌지 확인합니다. 이를 위해 세 번째 꼭짓점 t를 반복하고 결과가 \(d[t][t] < 0\)  (즉, 음의 가중치 주기에 있음) i 및 j — 그러면 경로는 \((i,j)\) 무한 길이일 수 있습니다.

Problem

가장자리에 약간의 가중치(길이)가 할당된 완전 방향성 그래프가 제공됩니다. 가중치는 양수, 음수 또는 0일 수 있습니다. 우리는 이 그래프에서 서로 다른 정점의 모든 쌍 사이에 가능한 모든 경로의 최소 길이에 관심이 있습니다. 이 최소값이 존재하는지 확인하고 존재하는 경우 이를 계산해야 합니다. (그래프에서 길이가 음수이고 임의로 절대값이 크고 무한대 경향이 있는 경로를 찾을 수 있는 경우 최소값은 없습니다.)
 
입력
첫 번째 줄은 N≤50 정점입니다. 다음은 그래프의 인접 행렬, 즉 각각 N개의 숫자를 포함하는 N개의 행입니다. 인접 행렬의 i번째 행의 j번째 숫자는 i번째 꼭지점에서 j번째 꼭지점까지 이어지는 가장자리의 길이를 지정합니다. 길이는 -1000000에서 1000000 사이의 값을 가질 수 있습니다. 행렬의 주 대각선에 0이 있음을 보장합니다.
 
출력
단일 숫자 인쇄 – 원하는 최소. 존재하지 않는 경우 출력  -1.
<헤드> <일># <몸>
입력 출력
1 <사업부>3
0 42 18468 
6335 0 26501 
19170 15725 0
42
2 <사업부>3
0 -7 3
<사업부>-2 0 10
2 215 0
-1