SPFAアルゴリズムテンプレート(劉Rujia版) - ワームホールPOJ - 3259

:パープル、常に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 }

 

おすすめ

転載: www.cnblogs.com/megadeth/p/11318218.html