3268 - 4つのテーマ別トピックシルバー牛パーティーPOJ kuangbin

 

トピックへのリンク:https://vjudge.net/problem/POJ-3268

質問の意味:スタートラインを点Xで、牛以外の点はパーティーにXを指すようにして、バック点Xからその地点まで、パスは一方通行で、すべての牛は、最短経路を取る必要があります

最長ですべての牛を行くための最短の道を探します。

(コードこれで直接見ては、ほとんど変更それ、および他のボードダイクストラです)


  1の#include <iostreamの>
   2の#include <CStringの>
   3の#include <アルゴリズム>
   4の#include <cstdioを>
   5の#include < ストリング >
   6  使って 名前空間STD。
  7   
  8のtypedef 長い LL。
  9  の#define 1 - INF(1LL << 30)
 10  の#define(私は++; iが=(K)<I =(J)INT)のための担当者(I、J、K)
 11  の#defineのrep __(I、Jを、 k)はのために(INT I =(j)は、iが<(K); I ++)
 12  の#defineあたり(i、j、k)のための(iは=(J INT); I> =(K); i--)
 13  の#define__あたり(I、J、K)のための(I =(J)がINT; I>(K); i--)
 14  
15  のconst  int型 N = 1010 16  INT G [N] [N]。
17  BOOL VIS [N]。
18  INT DIS1 [N]。
19  INT DIS2 [N]。
20  INTのU、V、W。
21  int型N、M、X。
22  
23  ボイドのinit(){
 24  
25      担当者(I、1、N)VIS [I] = 26      担当者(I、1、n)の担当者(J、1 、N){
 27          もし(I == j)のG [I] [J] = 0 ;
28           G [I] [J] = INF。
29      }
 30  }
 31  
32  空隙入力(){
 33  
34      担当者(I、1 、M){
 35          CIN >> U >> V >> W。
36          であれば(G [U] [V]> W)G [U] [V] = W。
37      }
 38  }
 39  
40  ボイドダイクストラ(){
 41  
42  ///////////////////////////////////// //////////////////// / 
43      // (1)第一部分
44     REP(I、1、N-)DIS1 [I] G = [I] [X]; // DIS []が最短距離X市ポイントに格納されている
45      VIS [X]は= trueに46は 
47      REP(I 、2 、N-){
 48  
49          INT X = - 1。;
 50          INT W = INF;
 51は、 
52である          REP(J、1 、N-){
 53が             IF(VIS [J] && W> DIS1 [J])W = DIS1! [X = J];
 54れる         }
 55は、         IF(X == - 。1続け56は 
57である          VIS [X] =trueに58          REP(K、1 N-、){
 59              // X kを指すように点kからの距離がポイントツーポイントxに点Xからの距離よりも大きい場合にXプラス距離がDIS次に更新[]アレイ
60              IF(VIS! [K] && DIS1 [K]> DIS1 [X] + G [K] [X]){
 61は                  DIS1 [K] = DIS1 [X] + G [K] [X];
 62である             }
 63れる         }
 64      }
 65  
66   //    REP COUT << DIS1 [I] << ENDL(I 1、N-を,.); 
67  
68  /////////////////////////// /////////////////////////////////
 69      // (2)第二の部分は、正確に同一のダイクストラボード
70      REP( I、1)N- VIS [I] =;
71      担当者(I、1、N)DIS2 [I] = G [X] [I]。
72      VIS [X] = 73  
74      担当者(I、2 、n)は{
 75          INT X = - 1 76          INT = W INF。
77  
78          担当者(J、1 、N){
 79              であれば(VIS [J] &&> DIS2 W [J]!)= DIS2 [X = W J]。
80          }
 81  
82          であれば(X == - 1続けます83  
84         VIS [X] = trueに85          REP(K、1 、N-){
 86              IF(!VIS [K] && DIS2 [K]> DIS2 [X] + {G [X] [K])
 87                  DIS2 [K] DIS2 = [X] + G [X] [K];
 88              }
 89          }
 90      }
 91が     INT ANS = 0 ;
 92  
93      // 前後ライン一緒に、最長のラウンドの選択は、答えは
94      REP( I、1、N-)IF(= X-I)= maxのANS(ANS、DIS1 [I] +!DIS2 [I]);
 95  
96      COUT ANS << << ENDL。
97  }
 98  
99  INT メイン(){
 100の  
101      IOS :: sync_with_stdio()。
102      cin.tie(0 )。
103  
104      CIN >> N >> M >> X。
105  
106      のinit();
107      入力()。
108      ダイクストラ()。
109  
110      GETCHAR(); GETCHAR()。
111      戻り 0 ;
112 }

 

おすすめ

転載: www.cnblogs.com/SSummerZzz/p/11204358.html