852 spfaをAcWingループ負の決意

#include <CStringの> 
する#include <iostreamの> 
する#include <アルゴリズム> 
の#include <キュー>
 使用して 名前空間STD;
 constの 整数 N = 2010、M = 10010 ;
 INT N-、M;
 INT H [N]、W [M] E [M]、NE [M]、IDX;
 INT DIST [N]; // 最短距離
INT CNT [N]; // のエッジの数最も短絡nは以上等しい場合には、負の環がある、
BOOL N STが[ ];
 ボイド追加(int型 A、INT B、INT C){ 
    E [IDX] = B、W [IDX] = C、NE [IDX] = H [A]、H [A] = IDX ++; 
} 
のInt SPFAは(){ 
    キュー < INT > Q;
     のためにINT I = 1 ; Iは<= N-; I ++ ){ 
        ST [I] = trueに ; // 負ではないがリングに、すべて置いてもよいですリストに追加点
        q.push(I); 
    } 
    ながら(q.size()){
         int型 T = q.front(); 
        q.pop(); 
        ST [T] = falseにのためにINT IはH [= T] ;! = I - 1。 ;私は= NE [I])を{
             INT J =E [i]は、
            もし(DIST [J]> DIST [T] + W [I]){ 
                DIST [J] = DIST [T] + [I] W。
                CNT [J] = CNT [T] + 1 もし(CNT [j]> = n)を返す もし(!ST [J]){ 
                    q.push(J)。
                    ST [J] = ; 
                } 
            } 
        } 
    } 
    を返す 
} 
int型のmain(){ 
    scanf関数(" %D%D "、&​​N、&M)。
    memsetの(H、 - 1はsizeof H)。
    一方、(M - ){
         int型A、B、C。
        scanf関数(" %D%D%D "、&​​、&B、&C)。
        (a、b、c)を加えます。
    } 
    であれば(spfa())プット(" はい" );
    他のプット(ノー)。
    リターン 0 ; 
}

 

 

 

おすすめ

転載: www.cnblogs.com/QingyuYYYYY/p/11842171.html