有向グラフ所与、原点からの最短距離の原点への最短パスとすべての点を見つけ、すべての点と:質問の意味
ソリューション:ビルド・マップ+ spfaリバース
書式#include <iostreamの> の#include <cstdioを> する#include <CStringの> の#include <キュー> 使用して 名前空間はstdを、 const int型の最大パケット= 1000005、MAXQ = 1000005 ; 構造体のエッジ{ int型次に、DIS;}エッジ[MAXQ] [ 2 ]。 int型、N、P、Q、ヘッド[最大パケット] [ 2 ]、n_e [ 2 ]、[最大パケット】DIS 2 ]。 BOOL VIS [最大パケット] [ 2 ]。 無効 spfa(int型 BGN、int型x)は; 無効のinit(); 空隙addedge(INT から、INTに、INT DIS、INT X)。 INT メイン() { scanf関数(" %のD "、&N) 用(int型のk = 1 ; kは<= N k個++ ) { int型 ANS = 0 、U、V、W。 初期化(); scanf関数(" %dの%のD "、&P&Q)。 用(int型 iは= 1 ; I <= Q iが++ ) { scanf関数("%D%D%D "、&U&V、およびW); addedge(U、V、W、1 ); addedge(V、Uを、W、0 ); } spfa(1、1 ); spfa(1、0 ); のための(int型 I = 2、I <= P; iは++ ) ANS [[I] + = DIS 1 DIS] + [I] [ 0 ]; のprintf(" %d個の\ n " 、ANS); } 戻り 0 ; } ボイド addedge(INT から、INTにINT DIS、INT X) { エッジ[ [++ n_e [X] [X] .next =先頭から] [X]。 エッジ[n_e [X] [X] .TO = であり; エッジ[n_e [X] [X] .DIS = DIS。 【ヘッドから ] [X] = n_e [X]。 } ボイドのinit() { memsetの(VIS、0、はsizeof (VIS))。 memsetの(頭、0、はsizeof (ヘッド))。 memset(エッジ、0、はsizeof (エッジ))。 memsetの(DIS、0x7f、はsizeof (DIS))。 } ボイド spfa(INT BGN、INT X) { int型Uを、V。 キュー < 整数 > Q; q.push(BGN)。DIS [BGN] [X] = 0 ; VIS [BGN] [X] = 1 。 一方、(!q.empty()) { U = q.front()。 q.pop(); VIS [U]は[X] = 0 。 用(int型 ; I I = I =ヘッド[U] [X]をエッジ[I] [X] .next) { V= エッジ[I] [X] .TO。 もし(DIS [V] [X]> DIS [U] [X] + エッジ[I] [X] .DIS) { DIS [V] [X] = DIS [U] [X] + エッジ[I] [ X] .DIS。 もし(!VIS [V] [X]) { VIS [V] [X] =!VIS [V] [X]。 q.push(V); } } } } }