4つのテーマ別最短演習A [Kuangbinが飛ぶためにあなたを取る] - 牛ホーム(spfaアルゴリズムを)来ティル

- 牛ティル帰ってきます

トピックへのリンク:https://vjudge.net/contest/66569#problem/A

トピック:

ベッシーは、フィールドに出ているとファーマージョンは朝の搾乳のために彼女を覚醒する前に、できるだけ多くの睡眠を得るために戻って納屋に取得したいです。ベッシーは彼女の美しさの睡眠を必要とするので、彼女は可能な限り迅速に戻って取得したいです。

ファーマージョンのフィールドは、その中にN(2 <= N <= 1000)ランドマーク、一意の番号1..Nを有しています。ランドマーク1は納屋です。ベッシーは終日立ったリンゴの木グローブランドマークN.牛はTランドマークとの間の種々の長さの(1 <= T <= 2000)双方向牛トレイルを使用してフィールドに移動されます。ベッシーは彼女のナビゲーション能力の自信を持っていないので、彼女はそれを開始したら、彼女はいつも最後までその開始から歩道にとどまります。

ランドマーク間の道を考えると、ベッシーが戻って納屋に取得するために歩く必要がある最小距離を決定します。
入力
* 1行目:二つの整数:TとN

*線2..T + 1:各行は3スペースで区切られた整数として歩道を説明しています。最初の二つの整数は、TRAILが移動する間のランドマークです。第三の整数は、範囲1..100軌跡の長さです。
出力
* 1行目:単一の整数、ベッシーはランドマーク1のランドマークNから取得するために移動しなければならない最小距離。
サンプル入力
5 
1 2 20 
2 30 
3 4 20 
5 20 
1 5 100
サンプル出力
90
ヒント
INPUTの詳細は:

5ランドマークがあります。

OUTPUTの詳細:

ベッシーは以下のトレイル4、3、2、1で家に帰ることができます。
 
質問の意味:
 
1307/5000
フィールドのベッシーは、私たちは彼女が朝の搾乳に目を覚ますだろうというとき、納屋に戻り、その後、ファーマージョンできるだけ多くをスリープ状態にしたいです。ベッシーは彼女の美しさの睡眠を必要とするので、彼女はできるだけ早く戻って来たいです。

    ファーマージョン部位は、N(2 <= N <=有する 1000) ランドマーク、一意の番号を1..N。ランドマーク1つの納屋、牛立っベッシー日リンゴの木は、フィールドT(1 <= T <=走行時に使用されるN.ランドマークであり、 2000年) のランドマークとの間の様々な長さのシェルター双方向トレースを、。ベッシーナビゲートする彼女の能力で不信任ので、彼女は一度トラックの最初から最後まで維持している始めました。

    ランドマークとの間の経路を考慮して、ベッシーは納屋に戻って行かなければならない最小の距離を決定します。これらの経路の一部が存在することを保証します。
入力
    * 1行目の2つの整数:TおよびN.

    *行2..T + 1:各列のトラックのスペースで分離された3つの整数を記述する。最初の二つは、整数トレイル旅行ランドマークです。第三のパスの整数の長さ、1..100の範囲です。
収量
    *行1:ランドマークN 1ランドマークの整数、ベッシー最小距離が通過しなければなりません。
サンプル入力

    5. 5
    1 2 20である
    2 3 30
    3 20 4
    4 5 20れる
    。1. 5 100

出力のサンプル

    90
アイデア:次のように最短テンプレートエントリのタイトルは、spfaアルゴリズムは次のとおりです。
 
// 
// 2019年7月14日に羽生によって作成されます。
//
する#include <iostreamの> 
の#include <アルゴリズム> 
書式#include <キュー> 
の#include <マップ> 
書式#include <CStringの> 
の#include <cstdioを>
 使用して 名前空間はstd; 
typedefの長い 長いLL。
#define MAX 0x3f3f3f3fは
 int型Tを、N。
const  int型 MAXN = 1005 ;
ブールブック[MAXN]。
int型のLU [MAXN] [MAXN]。
int型D [MAXN]。

ボイド spfa(INT A)
{
    int型になりました。
    memsetの(書籍、はsizeof (書籍)); 
    memsetの(D、MAX、のsizeof (d)参照)。
    キュー < 整数 > QU。
    D [A] = 0 ; 
    ブック[A] = ; 
    qu.push(A)。
    しばらく(!qu.empty())
    {  = qu.front(); 
        qu.pop(); 
        ブック[今] = ;
        以下のためにint型 i = 1 ; iが++; iが<= N 
        { 
            場合(D [I]> D [今] + LUの[今] [I])
            { 
                D [i]は = D [今] + LU [今] [I]。
                もし(!ブック[i])と
                { 
                    qu.push(I); 
                    この本は、[I] = ; 
                } 
            } 
        } 
    } 
} 

int型のmain()
{ 
    ながら(〜のscanf(" %d個の%のD "、&​​T、&N)){
         ためint型 i = 1 ; iが<= N; iが++ ){
             int型 J = 1 ; J <= I; J ++ ){
                 場合(I == j)は
                    LU [I] [J] = 0 ;
                他の
                    LU [I] [J] = LUの[jを] [i]は= MAX。
            } 
        } 
        int型のX、Y、Z。
        以下のためにint型 I = 1 ; I <= T; iは++ ){ 
            scanf関数(" %D%D%D "、およびX&Y、およびZ)。
            もし(Z < LU [X] [Y])
                 LU [X] [Y] = LUの[のY] [X] = Z; 
        }
        spfa(1 )。
        printf(" %d個の\ n " 、D [N])。
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/Vampire6/p/11201337.html