最短SPFAテンプレート

// 
//   兄弟のダイクストラ妻℃シャンた.cpp
 //   アルゴリズム
 // 
//   2018年8月6日ON david.xuによって作成されます。
 //   著作権2018銭漏れる?David.xu。すべての権利予約を。
 // 入力するとき負チーム以上n回ループBFS
 // 速い:DFSポイント短絡がほとんどで2回出現

する#include <stdio.hに> 
する#include <cstdlib> 
書式#include <CStringの> 
の#include <cmath> 
の#include <iostreamの> 
の#include <アルゴリズム> 
の#include <キュー> 
の#include <ベクトル>
 の#define MAXN 100010 使用して名前空間STD、INT

 

N、M、S、[MAXN] DIS。
BOOL VIS [MAXN]。

構造体の縁{
     int型のValへ; 
}。
ベクター <エッジ> E [MAXN]。

キュー < 整数 > Q; 

ボイドSPFA()
{ 
    ためint型 i = 1 ; iがn = <; iは++ 
        DIS [I] = 十億一
    DIS [S] = 0 ; 
    q.push(S); 
    VIS [S] = 1 一方、(!q.empty())
    { 
        int型のx =  q.front()。
        q.pop()。
        以下のためにint型 i = 0 ; iは、Eを<[X] .size(); iは++ 
        { 
            int型 = Y E [X] [I] .TO。
            もし(DIS [X] + E [X] [I] .val < DIS [Y])
            { 
                DIS [Y] = DIS [X] + E [X] [I] .val。
                もし(!VIS [Y])
                { 
                    q.push(Y)。
                    VIS [Y] = 1 
                } 
            } 
        } 
        VIS [X] = 0 
    } 
} 

int型)(主
{
    scanf関数(" %D%D%D "、&​​N、&M&S)。
    以下のためにint型 I = 1 ; I <= M; iは++ 
    { 
        int型のX、Y、Z。
        scanf関数(" %D%D%D "、およびX&Y、およびZ)。
        エッジTMP。
        tmp.to = Y。
        tmp.val = Z。
        E [X] .push_back(TMP)。
    } 
    SPFA()。
    int型 i = 1 ; iが<= N iが++ 
        のprintf(" %dの" 、DIS [I])。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/Tidoblogs/p/11222319.html