:パープル、常にSPFA質問の権利、権原リンクの負の側面があるかどうかを判断するためのアルゴリズムを書いた紫色の本のでしたが、不完全な、より洗練されたコードブックを感じたhttps://vjudge.net/problem/POJ-3259は、詳細を見て、コード
1の#include <cstdioを> 2の#include <CStringの> 3の#include <アルゴリズム> 4の#include <cmath> 5の#include <iostreamの> 6の#include <ベクトル> 7の#include < セット > 8の#include <キュー> 9 #定義 MAXN 500100 10 の#define 0x3f3f3f3f INF 11 使って 名前空間STDを、 12 typedefの長い 長いLL。 13 int型N、M、W。 14 構造体ノード 15 { 16 INT コスト、へ; 17。 ノード(int型 A、int型 B、int型 C)から(A)、コスト(C){}(B)に 18である ;} /// 構造端 19ベクトル< INT >をG [MAXN]; /// Gエッジから出発代表要素iは[I]で 20であるベクトル<ノード>エッジ; /// ストアすべて縁 21は、 BOOL INQ [MAXN]; 22である INT 、D [MAXN] CNT [MAXN]; 23は BOOL SPFA(int型S) 24 { 25 26である ため(INT I = 0; iが<= N;)DをI ++は[I] = INF。 27 のmemset(INQ、0、はsizeof (INQ))。 28 のmemset(CNT、0、はsizeof(CNT))。/// 初始化 29 Dは、[S] = 0 。 30 INQ [S] = 真。 31 キュー< 整数 > Q; 32 q.push(S); 33 ながら(!q.empty()) 34 { 35 INT U = q.front(); q.pop()。 36 INQ [U] = 偽。 37 以下のために(int型私は= 0 ;私はG [U]を<.size(); I ++は)/// 緩和エッジための出発点として、キューの先頭に 38である { 39 ノード&E = エッジ[G [U] [I]]。 40 IF(D [U] <INF && D [e.to]> D [U] + e.cost) 41であり 、{ 42であり 、Dは[e.to] = D [U] + e.cost; 43である IF(INQ [E! .TO])/// それぞれがキューイング緩和ポイント 44は、 { 45 ; q.push(e.to) 46である INQ [e.to] = trueに、 47 IF(CNT ++ [e.to]> N-)リターン falseに ; /// スラックポイントである場合のn倍上記負リング 48 } 49 } 50 } 51である } 52が 戻り trueに、 53である } 54が 空隙 AddEdge(INT から、INTに、int型のDIST) 55 { 56である edges.push_backは(ノード(から)に、DIST); 57である 整数 K = edges.size(); 58 [G から .push_back]( - K- 1。); ///初始化边、将他们编号 59 } 60 のint main()の 61 { 62 のint T。 63 のscanf(" %dの"、&T)。 64 一方(t-- ) 65 { 66 のscanf(" %D%D%D "、&N、&M&W)。 67 のためには、(int型 i = 1 ; iがMAXNを<; I ++は)G [i]が.clear(); 68 edges.clear()。 69 のために(int型 I = 0 ; iが<M; iが++ ) 70 { 71は INT U、V、コスト; 72 scanfの(" %D%D%D "、&U&V、およびコスト); 73である AddEdge(U、V、コスト); AddEdge(V、U、コスト); / // このパスは、(Iここで長いカード)双方向で 74 } 75 のために(INT I = 0 ;私は<W I ++ ) 76 { 77 INT U、V、コスト; 78 scanfの(" %D%D%D "、&U、V&、&コスト); 79 AddEdge(U、V、-COST); /// ワームホール量が負であり、ワンウェイ 80 } 81 であれば(SPFA(!1のprintf())" YESの\ n " ); 82 他の printf関数(" NO \ nを" ); 83 } 84 リターン 0 。 85 }