[2019 CSP-S合宿前] [羅区P1613]徒歩で

トピックへのリンク: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 }

 

おすすめ

転載: www.cnblogs.com/Xx-queue/p/11701125.html