説明
GFW(グレートファイアウォール)の、我々は直接などFacebookやTwitter、YouTubeの、などしかし、プロキシとプロキシサーバーの助けを借りて、多くのウェブサイトを訪問することはできませんので、我々は簡単にこれらのウェブサイトに得ることができます。
あなたはそれらのいくつかは、直接接続することができますが、他の人ができない、いくつかのプロキシサーバーのリストを持っています。しかし、あなたは一方向接続することにより、他のプロキシサーバを介してプロキシサーバを訪問することができます。
我々はすべて知っているように、インターネットの訪問の遅れは、訪問の私たちの気持ちを決定します。あなたが直接到達可能なプロキシサーバーを選択したら、ウェブサイトに到達するための最も遅れの方法を見つけるだろう非常にスマートプロキシソフトウェアを持っています。
あなたはすべての接続の遅れを知っています。あなたの訪問の遅れは、あなたの全体の接続のすべてのラグです。あなたが選ぶ、どのプロキシサーバ、訪問の遅れを最小限にしたいですか?
入力
複数のテストケースは、最初の行は、テストケースの数を示す整数T(T <= 100)です。
各テストケースの最初の行は、2つの整数N(0 <= N <= 1000)、M(0 <= M <= 20000)。N(1からNに標識された)プロキシサーバの数です。
0は、お使いのコンピュータと(N + 1)のラベルであるターゲットのウェブサイトのサーバーのラベルです。
M線は以下次いで、各ラインは三つの整数、U、Vを含有する、(0 <= U、V <= N + 1、1 <= W <= 1000)wは、uが直接Vに接続でき、遅延がWであることを意味します。
出力
あなたが直接接続することを選択しますプロキシサーバー各テストケースごとに1行の整数。あなたは、あなたのコンピュータから直接接続することができますプロキシサーバーを選択することができます。
複数の選択肢がある場合は、出力は少なくともラベルを持つプロキシサーバー必要があります。あなたは、任意の手段によって出力をターゲットウェブサイトを訪問することができない場合は「-1」(引用符なし)。あなたは直接のウェブサイトを訪問することができますし、遅れが(引用符なし)少なくとも、出力は「0」である場合。
サンプル入力
4 3 6 0 1 10 1 2 1 2 4 4 0 3 2 3 1 2 3 4 7 2 4 0 2 10 0 1 5 1 2 4 2 1 7 1 3 0 2 1 0 1 2 1 2 1 1 3 0 2 10 0 1 2 1 2 1
サンプル出力
3 -1 0 1 アイデア:このクエスチョンマークを見て、最短経路、私は直接ダイクストラ関数を記述するために始めたが、T、その主な機能にはダイクストラの機能を入れています内部に、私は間違っていたサイクルは、一日中、全体の考え方の爆発を行う場所。
/// /// _ooOoo_ /// o8888888o /// 88" 88。」 /// (| -_- |) /// O \ = / O /// ____ / `--- '\ ____ / // 」\\ | | // `。 /// / \\ ||| :||| // \ /// / _ ||||| - : - ||||| - \ /// | | \\\ - /// | | /// | \ _ | '' \ --- / '' | | /// \ .- \ __ `-` ___ / - 。/ /// ___ `。。」/--.-- \ `。。__ /// 。 "" ' < `.___ \ _ <|> _ / ___。' > ' ""。 /// | | 。: ` - \`; `\ _ /`;.`/ - `:| | /// \ \ ` - 。\ _ __ \ / __ _ /。、 `/ / /// ======` `-.____ -.___ \ _____ / ___.-` ____.- "====== /// `= --- =」 /// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^ /// 仏祝福、ノーバグ! /// する#include <cstdioを> する#include <iostreamの>文字列 > の#include <CStringの> の#include <cmath> の#include <アルゴリズム> 書式#include <キュー> の#include <ベクトル> の#include <マップ> 使用して 名前空間はstd; #defineっ長い長 のconst int型 MOD = 1E9 + 7 。 const int型 INF = 0x3f3f3f3f 。 int型、T、N、M、U、V、DIS [W 1000 + 8 [] 1000 + 8 ]、LEN [ 1000 + 8 ]、道路[ 1000 +8 ]。 ブール記号[ 1000年 + 8 ]。 INT メイン() { 用(scanf関数(" %のD "、&T); t-- ;) { scanf関数(" %d個の%のD "、&N、&M)。 以下のために(int型 i = 0 ; iが<= N + 1 ; I ++ ) のための(INT J = 0 ; J <= N + 1、J ++ ) 場合(I == j)はDIS [I] [J] = 0 ; 他の DIS [i]は[J] = infファイル。 以下のために(int型 i = 0 ; iがm <I ++の) { scanf関数(" %D%D%D "、&U&V、およびW)を。 DIS [U] [V] = W。 } (LEN、LEN埋める + N + 2 、INF)を、 フィル(符号、記号 + N + 2、0 ); LEN [ 0 ] = 0 。 道路[ 0 ] = - 1 。 以下のための(int型私は=0 ; iがN + < 2。I ++ ) { int型の POS、ミネソタ州= INF。 用(INT J = 0 ; J <N + 2、J ++ ) 場合(!ログイン[J] && LEN [J] <= ミネソタ州) { ミネソタ州 = LEN [J]。 POS = J; } 記号[POS] = 1 。 用(INT J = 0 ; J <N + 2、J ++ ) 場合(![j]をサイン&& LEN [J]> lenの[POS] + DIS [POS] [J]) { LEN [j]は lenの[POS] + = DIS [POS] [j]を。 道路[J] = POS。 } 他の 場合には(!ログイン[J] && LEN [J] == DIS [POS] [J] + LEN [POS]) 道路[J] = 分(道路[J]、POS)。 } もし(LEN [N + 1 ] == INF)のprintf(" -1の\ n " ); そう であれば(LEN [N + 1 ] == DIS [ 0 ] [N + 1 ])のprintf(" 0 \ nは" ); 他 { int型 K = N + 1 ; 一方!(道路[K] = 0 ) { 場合(道路[K] == 0)ブレーク; K = 道路[K]; } のprintf(" %d個の\ n " 、K); } } 戻り 0 ; }