タイトル説明
国がひどい内戦に直面している----国の都市は異なる指導者をサポートする2つの部分に分かれています。商人として、ミスターMは政治に注意を払っていないが、彼は実際に厳しい状況を知っている、そして、あなたのタスクは、彼ができるだけ早く家に達する支援することです。「安全のために、」、Mr.Mは、「あなたのルートが異なる陣営の二つの都市を結ぶ最大で1本の道路が含まれている必要があります。」と述べました あなたは、少なくともどのくらいの時間、それは彼の甘い家に到達するのにかかるミスターMを教えていただけますか?
説明を入力します。
入力は複数のテストケースが含まれています。 それぞれの場合の最初の行は、国の都市の数を表す整数N(2 <= N <= 600)です。 2行目は、道路の数であるもの整数M(0 <= M <= 10000)、含まれています。 以下のMラインは、道路の情報です。各ラインは、都市A及び都市B間の道路はT. Tが[1500]の範囲内にある時間を要するであろうことを意味する、三つの整数A、BおよびTを含んでいます。 次の部分は、i番目の整数iが都市の支持リーダーを示す1または2であるN個の整数を含んでいます。 問題を単純化するために、我々は、ミスターMが街1から始まり、彼の目標は、市1町2である都市2は、リーダー2の同じ側にある間は常にリーダー1がサポートしていることを前提としています。 すべての道路が双方向であり、2つの都市間でほとんど1つの道があることに注意してください。 入力は、N = 0の場合に終了されます。
出力説明:
各テストケースのために、最小時間を表す出力は1つの整数で家に到達します。 ミスターMの要求、出力-1の代わりによると、家庭に到達することは不可能である場合。
例1
エントリー
コピー2 1 1 2 100 1 2 3 3 1 2 100 1 3 40 2 3 50 1 2 1 5 5 3 1 200 5 3 150 2 160 5 4 3 170 4 170 2 1 2 2 2 1 0
輸出
コピー100 90 540
単一始点最短経路問題は、裸直接ダイクストラ(従来添加ヒープ最適化)を設定し、プラス2 1にはない都会の更新DISに決定されます。
#include <ビット/ STDC ++ H> の#define 0x3f3f3f3f INF 使用して 名前空間STDを、 CONSTの INT N = 700 。 const int型 M = 80000 ; int型N、M、TOL。 構造体のエッジ{ int型V、W、次。 }エッジ[M]。 int型のヘッド[N]、VIS [N]、DIS [N]; INT lable [N]。 ボイドのinit(){ TOL = 0 。 memsetの(VIS、0、はsizeof (VIS))。 memsetの(頭、 - 1、はsizeof(頭)); } ボイド addedge(INT U、INT V、INT W){ エッジ[TOL] = エッジ{V、W、ヘッド[U]}。 ヘッド[U] = TOL ++ 。 } 構造体ノード{ int型Uを、W。 ブール 演算子 <(CONSTノードA)のconst { 戻り W> AW。 } }。 PRIORITY_QUEUE <ノード> Q; ボイドダイクストラ(){ memsetの(DIS、INF、はsizeof (DIS))。 DIS [ 1 ] =0 ; q.push(ノード{ 1、0 })。 一方、(!q.empty()){ ノードA = q.top()。 q.pop(); INT U = AU、W = AW。 もし(VIS [U])続けます。 VIS [U] = 1 。 以下のために(int型 - ;!I = I =ヘッド[U] 1 ; I = {エッジ[I] .next) のint V =エッジ[I] .V、W = エッジ[I] .W。 もし(!VIS [V] && DIS [V]> DIS [U] + W &&!(lable [U] == 2 && lable [V] ==1 )){ DIS [V] DIS [U] + = W。 q.push(ノード{V、DIS [V]})。 } } } } int型のmain(){ ながら(〜のscanf(" %d個"、&N)&& N){ scanf関数(" %のD "、&M)。 初期化(); 以下のために(int型 i = 0 ; iがmを<; ++ I){ int型、U、V、W。 scanf関数(" %D%D%D "、およびuは、&V、およびW) addedge(U、V、 addedge(V、U、W)。 } のために(int型 i = 1 ; iは= N <; ++ I){ int型TMP。 scanf関数(" %のD "、&TMP)。 lable [I] = TMPと、 } ダイクストラ()。 もし(DIS [ 2 ] == INF)プット(" -1 " )。 他のprintf(" %d個の\ n "、DIS [ 2 ])。 } }