任意の2点間の短絡を求めるテンプレート短絡

1つの#include <ビット/ STDC ++ H.>
 2  の#define MP(I、J)make_pair(I、J)
 3。 の#define P対<整数、整数>
 4。 使用した 名前空間STD;
 5  CONST  INT INF = 0x3f3f3f3f ;
 6  CONST  INT = 5E3 + MAXN 10 ;;
 7。 int型N-、T;
 8  int型DIS1 [MAXN]、CDIS [MAXN];
 9  INT判事[MAXN];   // かどう走行単一始点最短ポイント(第2の最短)経路をマークするために使用
10ベクトル<P> E [MAXN]、VIS [MAXN];
 11  空隙ストレージ(int型 A、INT B、int型C)
 12は 、{
 13は、      E [A] .push_back(融点(C、B));     // 同様マトリックスデポジット側は、第1素子MPは重量である; 
14  }
 15  空隙予約(int型X)
 16  {
 17。     ためのINT I = 1 ; I <= N; I ++)   // 単一ソースパスX更新; 
18である         VIS [X] .push_back(MP(I、CDIS [I]))。
 19  }
 20  空隙をDij(int型A)
 21であり、 {
 22は     INT Wへ、
 23である      PRIORITY_QUEUE <P、ベクトル<P>、大<P >> Q。  // プライオリティキューは最小度に更新される
24      のmemset(DIS1、INF、はsizeof (DIS1));
 25      のmemset(CDIS、INF、はsizeof(CDIS));   //は、初期化
26である 
27      q.push(MP(0、));   // 最初のエントリ・ポイント
28      DIS1 [A] = 0 ;
 29  
30      しばらく!(q.empty()){
 31は          P = U q.top();
 32          q.pop()。
 33は、         IF(u.first> CDIS [u.second])   // この点の値は、その短絡よりも大きい場合、これは、最適化の一つである
34であり             続ける ;                //就跳过
35          INTは iは= 0 ; I <E [u.second] .size()を; ++ I){
 36の             // DIS [V]> DIS [U] + W     // 这里类似于这种; 
37              INT次= E [u.second] [i]が1次回+ u.first。  // DIS W [U] +。  
38              INT今= E [u.second] [I] .second。  // DIS [V]。
39              であれば(次の< DIS1 [今]){
 40                  スワップ([今] DIS1、NEXT)。
41                  q.push(MP(今DIS1 [今]));
42              }
 43              であれば(次の< CDIS [今]){
 44                 スワップ(CDIS [今]次);
45                  q.push(現在[今]融点(CDIS))。
46              }
 47          }
 48      }
 49      本()。
50  }
 51  のint main()の
 52  {
 53      のint M。
54      のscanf(" %D%D "、&​​N、&M)。
55      一方(M-- ){
 56          INT T1、T2、T3。
57          のscanf(" %D%D%D "、&​​T1、およびT2、およびT3)。
58         ストレージ(T1、T2、T3)。
59      }
 60      のint Q。
61      のscanf(" %dの"、&Q)。
62      一方(q-- ){
 63          のint X、Y。
64          のscanf(" %D%D "、およびX&Y)。
65          であれば(!ジャッジ[X])をDij(X)、ジャッジ[X] = 1 66          のためにINT iは= 0 ; iが<VIS [X] .size(); I ++ ){
 67は、             もし(VIS [X] [i]が1次回== Y){
 68                  であれば(VIS [X] [I]。二==INF)
 69                      のprintf(" NOルート\ nが" );
70                  のprintf(" %dの\ n " 、VIS [X] [I] .second)。
71                  ブレーク;
72              }
 73          }
 74      }
 75      リターン 0 76 }

 

おすすめ

転載: www.cnblogs.com/pangbi/p/11845683.html