int型CNT; INT H [MAXN]。 int型の準備[MAXN]。 int型のPREE [MAXM]。 int型のDIS [MAXN]。 int型 ST = MAXN - 2 。 int型の ED = MAXN - 1 。 構造体のエッジ { int型V、NXT。 int型F、W; } E [MAXM]。 int型ヘッド[MAXN]。 インラインボイドのinit() { memsetの(頭、 - 1、はsizeof (ヘッド))。 CNT = 1 。 } インラインボイド追加(INT U、int型 V、INT、W int型F) { E [ ++ CNT] .V = V。 E [CNT] .nxt = 頭部[U]。 ヘッド[U] = CNT。 E [CNT] .F = F。 E [CNT] .W = W。 E [ ++ CNT] .V = U。 E [CNT] .nxt = 頭部[V]。 ヘッド[V] = CNT。 E [CNT] .F = - F。 E [CNT] .W = 0 。 } インライン対 < INT、INT> dijstra() { int型 MAXF = 0 。 int型ミンク= 0 ; 一方、(1 ) { PRIORITY_QUEUE <ペア< INT、INT >> ヒープ。 memset(DIS、0x3fを、はsizeof (DIS))。 DIS [ST] = 0 ; heap.push(make_pair(0 、ST))。 しばらく(!heap.empty()) { ペア < int型、int型> X = heap.top()。 heap.pop(); もし(!-x.first = DIS [x.second])続けます。 もし(x.second ==編)ブレーク。 用(INTは - ;!私= iはヘッド[x.secondを] = 1 ; iが= E [I] .nxtを) { int型今= E [I] .F + H [x.second] - H [E [I ] .V]。 もし(E [I] .W> 0 && DIS [E [I] .V]> DIS [x.second] + 今) { DIS [E [I] .V] = DIS [x.second] + 今。 heap.push(make_pair( -DIS [E [I] .V]、E [I] .V))。 予備校[E [i]は.V] = x.second。 PREE [E [I] .V] = I。 } } } もし(DIS [ED]> = 0x3f3f3f3f)ブレーク。 以下のために(INT iが= 0 ; <I = N; I ++)H [I] + = DIS [i]は、 int型になりました= 0x3f3f3f3f 。 以下のために(int型私はエドを=;!私= ST;私は= 予備校[i])と なりました = 分(。今、E [PREE [I]]ワット)を、 以下のための(int型 I編=。I = ST!; 私は= 分取[i]は) { E [PREEを[I]、W。 - = 今。 E [PREE [I] ^ 1 ] .W + = 今; } MAXF + = 今。 ミンク + =今* H [ED]。 } 戻りmake_pair(MAXF、ミンク)。 }