#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 ; }