【PAT】A1018公共自転車の管理

[思考]

件名の言葉

フィギュア

nはデジタル

。Vは、発見を考えて、コンピューティング、重要な部分がある......

ステーションは、で表される頂点の道路は対応エッジ S。

頂点がステーションを表す、側道を表します。

相当に対応

容量

。N能力、キャパ

 

 

 

 

 

 

 

件名効果:駅あたりの車両数が半分Cmaxは、はるかに少ないパディング離れているので、こと、道道駅の道を調整し、0から始まる、ステーション数を調整する必要性を与えられました。同一さらには最小バック0車道を選択された場合、最短経路から選ば、最短は、0車道から同一の最小帯域から選択されます。

パスの出力を持って車両の数、(直接戻るリターンに、無調整)は、車両の後部の数。

方法:ダイクストラ+ DFS。ダイクストラアルゴリズムは、最短パスを計算するためにまず、ベクトルのみの保存パス前駆ノード確立、最短を考えます。DFSは、パスを取得した後(すなわち、開始ノード0へトラバース)が最良の方式を決定するために、車両の後部をもたらすために計算され、各パスを横切ります。

車両はその数や車のトランス自転車の数を受け継が前に、各サイトの違いについては、[i]は、サイトの結果を考慮して、コメントを追加のCmax / 2、2例:車の、持ち込まバックナンバーの計算 - 1、差が増加をもたらす差分の絶対値の値が、車両まで送信の数は、トランス0に設定されているので、即ち車は、車で0からでは、十分ではない、負であり、第二に、非負差ショーに十分な車、車を複数のトランスに割り当てられているが、次の駅にもたらす価値の遺跡を通過しました。トランスは、最初は0の値をもたらす、トラバースノードが次のノードから出発して計算される(すなわち、次のノードのノード番号0)。最終的には車両、車両のトランス裏の、すなわち数を運ぶために0から番号を持って来ます。車の前に、唯一のより多くの関係なく、車のサイトの背後にある、関係局を介して、現在、と、0バンドからどのくらいの車に関連する注意が十分ではありません、我々は車両の数を運んで、振り返らないためにポイント0から徒歩なければなりません(事前経路に)変化します。DFSは、あなたがアウトカウントされるために完全なパスを要求する必要があり、開始点の端から端まで前方に押し出されます。最後に、後方可変長アレイの出力値、すなわち、パス。

[ヒント]巧みに最高のパスをDFSアルゴリズムダイクストラ+を使いたいです!

[AC]コード

  1  の#define _CRT_SECURE_NO_WARNINGS
   2の#include <iostreamの>
   3の#include <ベクトル>
   4  使用して 名前空間をSTD。
  5  の#define N 502
   6  の#define INF 100000000
   7  INT のCmax、局、目標、道路。
  8  INT 自転車[N]。
  9  INTの長さ[N] [N] = {{ 0 }}。
10  BOOL VIS [N] = {};
11  INT D [N]。
12ベクター< INT > 予め[N]。
13ベクター< INT> パス;
 14  INT minbring = INF、minback = INF;
 15ベクトル< INT > ベストパス、
 16  空隙 DFS(int型V)
 17  {
 18は     IF(V == 0// 境界-開始ノード。
19      {    
 20          // 第二及び第三のスケール値計算の数は、すなわちバック車両に、もたらしました。
21は         path.push_back(V)、
 22は         intをもたらす= 0 ;
 23である         int型トランス= 0 ;
 24          のためにINTiがpath.size()= - 2I> = 0 ; i-- 25          {
 26              INT   U = パス[I]。
27              であれば(自転車[U] +トランス> =のCmax / 2 28              {
 29                  トランス+ =自転車[U] -のCmax / 2 30              }
 31              他の
32              {
 33                  + =のCmax /持参2 -自転車[U] - トランス。
34の                  トランス= 0 35              }
 36         }
 37          // 更新最优值。
38          もし(持参< minbring)
 39          {
 40              ベストパス= パス。
41              minbringは= 持参します。
42              minback = トランス;
43          }
 44          そう であれば(==もたらすminbring)
 45          {
 46              であれば(トランス< minback)
 47              {
 48                  ベストパス= パス。
49                  minback = トランス;
50              }
 51          }
 52          path.pop_back()。
53          リターン;
54      }
 55      のint I。
56      path.push_back(V)。
57      のためには、(iは= 0 ; iが<PRE [V] .size(); I ++ 58      {
 59          DFS(予備[V] [I])。
60      }
 61      path.erase(path.end() - 1)。// 可以写成path.pop_back(); 
62  }
 63  空隙ダイクストラ(INT S)
 64  {
65      INT I、J、
 66      塗りつぶし(D、D + N、INF);
 67      D [S] = 0 ;
 68      のために(私は= 0 ; I <=ステーションI ++ 69      {
 70          // 見つからないの濃縮Dの最小
71は、         INT分= INF、U = - 1。;
 72          (J = 0 ; J <=ステーション; J ++ 73である         {
 74              IF(MIN> D [J] && VIS [J] == 0 75              {
 76                  =分D [J]。
77                  Uは= ; J
 78              }
 79          }
 80          IF - (U == 1リターン;
 81          VIS [U] = trueに;
 82          // 点VにU Sによるエネルギー、更新経路のための
83          のために(J = 0。 J <=ステーション; J ++ 84          {
 85              IF(長さ[U] [J] && VIS [J] == 0 86              {
 87                  IF(D [U] +長さ[U] [J] < D [J] )    
 88                  {
 89                     D [J] = D [U] + 長さ[U] [J]。
90                      プレ[J] .clear();
91                      プレ[J] .push_back(U)。
92                  }
 93                  他の 場合(D [U] +長さ[U] [J] == D [J])
 94                  {
 95                      プレ[J] .push_back(U)。
96                  }
 97              }
 98          }
 99  
100      }
 101  }
 102  
103  INT メイン()
 104  {
 105      CIN >>のCmax >>局>>目標>>道路;
106      INT I。
107      のための(iは= 1 ; I <=ステーション; I ++ 108          CIN >> 自転車[I]。
109      のための(iは= 0 ; I <道路、I ++ 110      {
 111          INT U、V。
112          CIN >> U >> V;
113          CIN >> 長[U] [V]。
114          長さ[V] [U] = 長さ[U] [V]。
115      }
 116      ダイクストラ(0 )。
117の     DFS(目標)。
118     coutの<< minbring << " 0 " ;
119      のための(I = bestpath.size() - 2 ; I> = 0 ; i-- 120      {
 121          COUT << " - > " << ベストパス[I]。
122      }
 123      COUT << "  " << minback。
124      戻り 0 ;
125 }

 

おすすめ

転載: www.cnblogs.com/yue36/p/12316123.html