Uva721招待カード

有向グラフ所与、原点からの最短距離の原点への最短パスとすべての点を見つけ、すべての点と:質問の意味

ソリューション:ビルド・マップ+ 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(11 ); 
        spfa(10 );
         のためのint型 I = 2、I <= P; iは++ 
            ANS [[I] + = DIS 1 DIS] + [I] [ 0 ]; 
        のprintf(" %d個の\ n " 、ANS); 
    } 
    戻り 0 ; 
} 
ボイド addedge(INT  からINTINT 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); 
                } 
            } 
        } 
    } 
}

 

おすすめ

転載: www.cnblogs.com/nenT/p/11621566.html