[牛オフ] [北京大学大学院再テスト]アイワナゴーホーム[ダイクストラ]

タイトル説明

    国がひどい内戦に直面している----国の都市は異なる指導者をサポートする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(ノード{ 10 })。
    一方、(!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 ])。
    } 
}

 

おすすめ

転載: www.cnblogs.com/mizersy/p/11613946.html