最も典型的な短絡、およびちょうど操作を少し追加し、答えを得ることができるようになります
だから、直接テンプレートを設定することができます
参照するには、特定のプログラム::
1つの#include <cstdioを> 2の#include <キュー> // キュー固有のヘッダファイル 3。の#include <アルゴリズム> 4。 使用した 名前空間STD; 5 のconst int型 N = 100005 ; 6 INT A [N]; 7 INT N-、M、L 、SUM、ANS; 8 INT D1 [N]、T [N]、HEAD1 [N]、Next1 [N]、W1 [N]、ADJ1 [N]、K1; 9 BOOL F1 [N]; 10キュー< INT > Q1を; // グローバル変数を定義好む 11。 ボイド追加(INT U、int型 V){ //1の各辺の重みは、第3の可変持たないので、動作をエッジング 12れる Next1 [++ K1] = HEAD1 [U]; 13は HEAD1 [U] = K1; 14 W1 [K1] = 1 ; / / それが変数T(それらの定義)に入れていない1、場合 15 ADJ1 [K1] = V; 16 } 17 空隙 SPFA(int型 S、INT E){ // SPFA、最短テンプレート 18がある ため(INT I = 。1 ; I <= N; I ++が) 。19 D1 [I] = 1。 << 30 ; // 形成無限 20は D1 [S] = 0 ; 21は q1.push(S)、 22である F1 [S] = trueに、 23であり 、一方(!{Q1.empty()) 24 INT TOP1 = ; q1.front() 25 q1.pop(); // デキュー 26である F1 【TOP1] = falseに、 27 のために(INT J = HEAD1 [TOP1];!J = 0 ; Jは= Next1 [J]){ 28 IF(D1 [ADJ1 [J]]> D1 [TOP1] + W1 [J] ){ // 緩和操作 29 T [ADJ1 [J] ++ ; 30 D1 [ADJ1 [J] = D1 [TOP1] + W1 [J]; 31れます もし(!F1 [ADJ1 [J]]){ 32 q1.push(ADJ1 [J])。 33の F1 [ADJ1 [J] = 真。 34 } 35 } 36 } 37 } 38 } 39 INT メイン(){ 40 // freopenは( "hideseek.in"、 "R"、STDIN)。 41 // freopenは( "hideseek.out"、 "W"、STDOUT);不要在意... 42 のscanf(" %D%dの"、&N、&M)。// 读入 43 のための(int型 I =。1 ; I <= M; I ++ ){ 44は int型;、Y X 45 scanfの(" %のDの%のD "、およびX&Y); 46である 追加(X、Y); 47 追加(Y、X); // それは無向グラフであるため、2追加するために、操作をエッジング 48 } 49 SPFAを(1、N-); // の呼び出し 50 のために(INT I = 1 ; I <= N; I ++ ){ 51が IF(D1 [I] > L){ // 点が今よりも大きく表示された場合、交換 52は L = D1 [I]; 53は ANS = I; 54であります = SUM 1。; 55 } 56である 他{ 57は IF {(D1 [I] == L)// 追加するように 58 SUM ++を; 59 } 60 } 61れる } 62である のprintf(" %D%D%D \ N- "、ANS 、L、SUM)が; // 出力 63は、 戻り 0 ; 64 }
実際には、トラブルのないアナログキューのかなりの配列は、私だけの確実性よりも、変更、および書き込みか、ご自分のサイトを作成するにはあまりにも怠惰な、テンプレートを適用します
それ。。新人はそれについてボーを開くために奨励されています~~