[思考]
件名の言葉
フィギュア | 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()= - 2。I> = 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 }