トピックへのリンク:https://www.luogu.org/problem/P1613
トピックは非常に明白なプロンプトが表示されています!
あなたは各2実行することができKそれについてキロ明白なことと乗算を。
データの範囲を見て、N <= 50であり、これは最短ああフロイド使用するために私達を促す追求します。
そこで溶液は出てきた、オープンのアレイ(例:C [I] [J] [K])、
iがjは長さ2のパスがあるかどうかを満足する点から点へ表すK、再び行わfloyd'reピット。
(最長パスmaxlongintが、実際には倍長整数は、混乱INTないでkの範囲は32で十分である、64であることに留意されたいです)
1つの#include <ビット/ STDC ++ H> 2 の#define MAXN 50 + 5 3 使用して 名前空間STDを、 4 int型N、M、ANS。 5 INT C [MAXN] [MAXN] [MAXN]、[MAXN] [MAXN] C。 6 ボイドフロイド() 7 { 8 ための(int型のk = 1 ; kは<= N; ++ k個) 9 { 10 のためには、(INTは i = 1 ; iが<= N; iは++ ) 11 { 12 のための(int型、J = 1、J <= N; J ++) 13 { 14 であれば(C [I] [J]> [I] [K] + C C [K] [J]) 15個の C [I] [J] = Cを[I] [K] + C [K ] [J]。 16 } 17 } 18 } 19 } 20 のint main()の 21 { 22 のscanf(" %D%dの"、&N、&M)。 23 のmemset(C、0x3fを、はsizeof (c)参照)。 24 のために(int型 I = 1 ; I <= M Iは++ ) 25 { 26 int型のuを、V。 27 のscanf(" %D%dの"、&U、およびV)。 28 C [U] [V] [ 0 ] = 1 。 29個の C [U] [V] = 1 。 30 } 31 のための(int型のk = 1 ; K <= 32 ; kは++ ) 32 { 33 のために(int型 i = 1 ; iが= N <; I ++ ) 34 のための(INT J = 1 ; J <= N; J ++ ) 35 以下のための(INT P = 1 ; p <= N; p ++ ) 36 であれば(C [I] [J] [K- 1 ] && C [J] [P] [K- 1 ]) 37 { 38 C [i]と[P] [K] = 1 。 39個の C [i]と[P] = 1 。 40 } 41 } 42 フロイド()。 43 のprintf(" %dの"、C [ 1 ] [N])。 44 リターン 0 ; 45 }