問題の上映溶液(最短+スーパーソース)

タイトル説明

サーバーの抵抗力を高めるために、多くの大規模なトラフィックの多いサイトは、複数のサーバを設定し、最短ルート1サーバを見つけるためにインターネットでルーティングしています。UOIは今フィルムが示された、彼はコンピュータをたくさん持って望んでいる、ダウンロード可能なサーバがたくさんあります。UOIネットワークは、あなたのマップを与えるあなたは少しの間の線の長さを伝え、どのくらい長く最短ライン、および台湾は、選択したコンピュータとサーバの選択数をダウンロードするために使用されることを尋ねます。複数のコンピュータ/サーバ間の場合は、最短接続線、最も小さい番号の出力コンピュータであり、最も小さい番号の出力サーバの幅広い選択がある場合。

入力形式

最初のラインN、M、nはグリッドとの合計点を示し、ネットワーク接続部Mのm行次に、ネットワーク接続は、接続されたA、B、点と線のそれぞれの長さを表します。そして、T1の数は、どのように多くのコンピュータUOIを表明しました。次のラインT1の数は、各コンピュータUOIの数を示します。そして、T2の数は、どのように多くのサーバを示します。T2の次の行番号、IDは、各サーバーを表します。

出力フォーマット

三個のすなわち数字、ラインの長さは、コンピュータUOIダウンロードして、ダウンロード元のシートを提供します

-------------------------------------------------- -------------------------------------------------- ---------------------

 

変換質問が意図されて:あなたは、ソースとシンクを接続する経路を求めて、ソースとシンクのいくつかの数を、与えることと、このパスの長さを最小限に抑えること。

使用n回はTLE明らかspfa。スーパーソース:今回はコンセプトを紹介したいと思います。これは、すべてのソース点を接続することができ、夜12時00分の数の導入を意味し、原画像、即ち、ゼロの長さに影響を及ぼしません。だから、spfaの十分一度実行します。この質問は、出力ソースおよびシンクを必要とし、私たちは事前に配列を開いて、各点は、前駆体(前駆体はあなたがそこに着くことができ、そこからソースを参照)を記録することができます。

少しのコードでは、自分のアイデアに沿って、少し修正を行います。

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
キュー < 整数 > Q;
構造体ノード
{ 
    INT DIS、であり; 
}。
ベクター <ノード> V [ 100005 ]。
整数 N、M、T1、T2、[ 100005 ]、VIS [ 100005 ]、プリ[ 100005 ]。
長い 長い ANS = 9223372036854775807、DIS [ 100005 ]。
int型ANS1、ANS2。
INT メイン()
{ 
    memsetの(DIS、0x3fをはsizeof (DIS))。
    のscanf("%D%D "、&​​N、&M)。
    INT iは= 1 ; I <= M I ++ 
    { 
        int型、U、D、に; 
        scanf関数(" %D%D%D "、&​​U、&に、&D)。
        V [U] .push_back((ノード){D、へ})。
        V [する] .push_back((ノード){U、D})。
    } 
    のscanf(" %dの"、&T1)。
    以下のためにINT iが= 1 ; I <= T1; I ++)のscanf(" %dの"、および[I])。、A + T1 + )。
    scanf関数(" %のD "、&T2)。
    int型T;
    以下のためにINT iが= 1 ; I <= T2; I ++)のscanf(" %dの"、&​​T)、予め[T] = T、VIS [T] = 1、DIS [T] = 0 、q.push(T );
    一方、(!q.empty())
    { int型今= q.front(); q.pop(); VIS [今] = 0 ;
        INT iは= 0 ; I <V [今] .size()は、i ++ 
        { int型へ= V [今] [I] .TO。
            もしA + T1 + 1
        
            (DIS DIS [今] +>に]V [今] [I] .DIS)
            { 
                [する]事前 = 事前[今]。
                【へ】DIS = DIS [今] + V [今] [I] .DIS。
                もし(VIS [へ]!)VIS = [へ] 1 、q.push(へ); 
             } 
        } 
    } 
    のためにINT iは= 1 ; I <= T1; I ++ 場合(ANS> DIS [I])ANS = DIS [I]、ANS1 = A [i]は、
    printf(" %LD%D%D " 、ANS、ANS1、予め[ANS1])。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/Invictus-Ocean/p/12454307.html
おすすめ