タイトル説明
ファーマージョンは最近、自動車部品の購入には、インターネット上で新しい車を買って、ジョンは偶然2「送信」ボタンを命じました。車にインストールされているGPSシステムの2つのセットが得られ、さらに悪いジョンは、GPSナビゲーションを使用している、2つのシステムは、多くの場合、別のルートを与えます。マップから、交差点及びM(50万≤1≤M)ストリップの制限道路交通方向(10万≤2≤N)ジョン・Nを居住エリアがあります。iはa_iを(1≤a_iを≤N)とB_i(1≤B_i≤N)を番目交差道路リンクは、2つの交点間の道路の複数に接続されてもよいです。双方向通信経路を可能にする離間形成を介して双方向パスしながら実行することです。
交差位置1、N.の接合部で農場の位置のジョンの家 ジョンは一方通行の道路の系列に沿っファームに自宅からドライブすることができます。すべてのGPSシステムの基礎となる地図情報のような、唯一⾏道路を介して各時間について計算異なる⼀です。GPSシステムの第二のセットは、時間のQ_I単位を与えている間、i番目の道路のGPSシステムの第一のセットのために、時間のP_Iユニットの移動時間を算出します。ジョンが農場に家から車を希望する(すべての道路の所要時間は100,000 1の間の範囲の整数です)。GPSシステムの別のセットでは、この交点Xからのものではないことであるがしかし、方法のGPSシステムは、ジョンによるものである、(交差点Xバウンド交差点Yから入手可能)、ジョンに思い出させるのタイヤは、GPSシステムの提案されたセットのパスを選択したことがありませんファームへの最短経路。私たちは、GPSシステムに文句を言うために呼ばれます。
あなたはジョンを計算する場合、最小のGPSシステムファームに到達するために正しい道を選ぶの苦情の数を聞くことができます。ジョンは、特定の道路の後に2つのGPSシステムが発行している場合は、文句合計プラス2を訴えます。
入出力フォーマット
入力フォーマット:
最初の行、二つの整数N及びM.
次のM行、道路情報のi番目の行iが記載されており、a_iをB_i P_I Q_I。
出力フォーマット:
ジョンは聞くことができる方法に文句の最小数を表す整数。
サンプル入力と出力
1
ゴシップ:
2017年は、私たちの先生は最短を話し始めた、このタイトルの後に終了しました。。。その後、我々は1ヶ月以上話しました。。。
分析:
私が考えるのは他に何かわからないものに加えて、この質問最短経路アルゴリズム。。。
主に二つの異なる値システムによって三回SPFA、最初の2回実行し、オペレータに最短経路を与え、それが再び最短の答えを得ないし、各エッジ再構成の値について文句を押します。
CODE:
1の#include <cmath> 2の#include <cstdioを> 3の#include <CStringの> 4の#include <iostreamの> 5の#include <アルゴリズム> 6の#include <キュー> 7 使って 名前空間STDを、 8 のconst int型 M = 1000005 。 9 CONST 長い 長い OO =(1LL << 61 )。 10 int型NXTに[M]、[M]、ヘッド[M]、INQ [M]、TOT、RTOT。 11 のint rnxt [M]、RTO [M]、rhead [M]。 12 のint ADJ1 [M]、ADJ2 [M]、ADJ3 [M]。 13 長い 長いですdist1 [M]、dist2 [M]、dist3 [M]。 14 int型N、M。 15 ボイド追加(INT U、INT V、INT W1、INT W2){ 16 NXT [++ TOT =頭部[U];頭部[U]はTOTを= [TOT]へ= V。 17 ADJ1 [TOT = W1; ADJ2 [TOT] = W2。 18 リターン; 19 } 20 空隙 RADD(INT U、INT V、INT W){ 21 rnxt [++ RTOT] = rhead [U]; rhead [U] = RTOT; RTO [RTOT] = V; ADJ3 [RTOT] = W。 22 リターン; 23 } 24 ボイドspfa1(){ 25 キュー< INT > Q。 26 Q.push(N); INQ [N] = 1 ; [N] dist1 = 0 。 27 ながら(!{Q.empty()) 28 のintトップ= Q.front(); Q.pop()、INQ [トップ] = 0 ; 29 のために(int型 ; I; I =ヘッド[トップ] I = NXT [i])と 30 であれば(dist1 [トップ] + ADJ1 [I] < dist1 [する[I]]){ 31 dist1 [する[I] = dist1 [トップ] + ADJ1 [I]。 32 もし Q.push([I]に)、= [I]乃至] INQ(INQ [する[I]]!)1 。 33 } 34 } 35 リターン。 36 } 37 空隙spfa2(){ 38 キュー< INT > Q。 39 Q.push(N); INQ [N] = 1 ; [N] dist2 = 0 。 40 ながら(!{Q.empty()) 41 のintトップ= Q.front(); Q.pop()、INQ [トップ] = 0 ; 42 のために(int型 ; I I = I =頭[トップ] NXT [I]) 43 場合(dist2 [トップ] + ADJ2 [I] < dist2 [I]に]){ 44 = dist2 [トップ] + [I]乃至] dist2 [I] ADJ2。 45 もし Q.push([I]に)、= [I]乃至] INQ(INQ [する[I]]!)1 。 46 } 47 } 48 リターン。 49 } 50 空隙spfa3(){ 51 キュー< INT > Q。 52 Q.push(1); INQ [ 1 ] = 1 ; dist3 [ 1 ] = 0 ; 53 ながら(!Q.empty()){ 54 のintトップ= Q.front(); Q.pop()、INQ [トップ] = 0; 55 のために(INT I = rhead [トップ]; iは、i = rnxt [i])と 56 であれば(dist3 [トップ] + ADJ3 [I] < dist3 [RTO [I]]){ 57 dist3 [RTO [I] = dist3 [トップ] + ADJ3 [I]。 58 もし Q.push(RTO [i])と、INQ [RTO [I] =(INQ [RTO [I]]!)1 。 59 } 60 } 61 リターン。 62 } 63 INT メイン(){ 64 のscanf(" %D%dの"、&N、&M)。 65 のための(int型 I =1、I '= N; iが++)dist1 [I] = dist2 [I] = dist3 [I] = OO。 66 のために(int型 I = 1 ; I <= M Iは++ ){ 67 のint U、V、W1、W2。 68 のscanf(" %D%D%D%D "、&U&V、&W1&W2)。 69 アドオン(V、U、W1、W2)。 70 } 71 spfa1(); spfa2()。 72 のために(int型 I = 1 ; I ++; iが<= N ) 73 のための(INT J =頭部[I]; J; J = NXT [J]) 74 RADD([J]に、I、(dist1 [I] + ADJ1 [J]> dist1 [する[J])+(dist2 [I] + ADJ2 [J]> )[J]に] dist2)。 75 spfa3()。 76 COUT << dist3 [N]。 77 リターン 0 。 78 }