成層P4568 [JLOI2011]飛行ルートマップ

タイトル説明

今の空気で旅行アリスとボブは、彼らが比較的安価な航空会社を選びました。合計航空n個のn都市交通と、標識されたセットの都市0 0〜Nを、1-。N - 1、合計m個の経路のM種類、二つの都市を結ぶ各路線、価格一定の経路。

アリスとボブは今、ルートに沿って別の都市に1つの都市からあなたが転機ことができる方法を到着しています。また、彼らが提供しています。この旅行で打ち上げ航空会社は、彼らが多くて自由であるk個のルートのk個の種類のフライ。アリスとボブは、この旅行は過ごすには最低額のですか?

入力形式

最初の行は、3つの整数データ、有するN-、M、kはN- M K、それぞれ、都市の数、経路および遊離乗り物の数。
2行目は、2つの整数有するSは、T S T、彼らの旅行都市ID番号、都市の端部の開始点を表しています。
次の3つの整数のm行が存在するA、B、C 、A B Cは、都市からのルートがあることを示し、A A到着都市B Bは、または都市からBのB到着都市A A、価格C 、C。

出力フォーマット

最小のコストのために、整数を含む一行のみ。

サンプル入力と出力

入力#1
5 6 1 
0 4 
0 1 5 
1 2 5 
2 3 5 
3 4 5 
2 3 
0 2 100
出力#1
8

データ範囲

 問題解決能力

この質問は、階層図である一見、感じは非常に簡単で、その後、彼は死んでいた見つけ、この事が対処するのは難しいされて、その後にたかったKを見つけ、あなたはK層を構築することができ、それぞれの層は完全グラフです、それは第一層ZがZ倍自由落下ケースである平面の時の双方向エッジとすることができるので、現在のポイントは、ポイントを指すように起因して、全ての辺も一方向側0のコスト以下に現在のポイントであることを意味します接続されている現在の点の次の層に一方から行く、コードは、で書かれています

1    のためのint型 I = 1 ; I <= M Iは++ 2      {
 3          のscanf(" %D%D%D "、およびX&Y、&W)。
4          (X、Y、W)を加えます。
5          (Y、X、W)を加えます。
6          のためのint型 J = 1 ; J <= K; J ++ 7          {
 8              追加(X +(J×n個)のY +(jは*のN)、W)。
9              (のy +(J×n個)、X +(J *の追加のN)、W)を。
10              追加(X +((J- 1)* N)のY +(J×n個)、0 );
11             追加(図示Y +((J- 1)* N)、X +(J×n個)、0 );
12          }
 13      }

 

 あなたが二階のフィニッシュラインにすることができた場合でも、ことを念頭に、しかし最終的に私たちの出力に対する答えは、最初のK層DISの終わりなので、それぞれの層の端がダウンして0であってもコストの一端であることを側、あるいは意志のトラブル

1     ためint型 i = 1 ; iは= Kを<I ++は2      {
 3          追加さ(t +(I- 1)* N、tは+ iは、N * 0 )。
4      }

 

 最後に、そこに、NOIは兄以上が、総感覚の外にハングアップしますSPFAを使用しないように、まだ最高でしたし、教師はNOIPデータ対象水を述べ、ライン上でダイクストラについて走りました。
最後に、完全なコードについて置きます
1の#include <iostreamの>
 2の#include <cstdioを>
 3の#include <CStringの>
 4の#include <キュー>
 5  使って 名前空間STDを、
6  のconst  int型 MAXN = 1E6 + 10 7  INTのN、M、K、S、T。
8  INT X、Y、W。
9  構造体の10  {
 11      INT に、
12      int型の値。
13      INT 次。
14 }の方法[MAXN * 6 ]。
15  int型のTOT;
16  INTDIS [MAXN]。
17  BOOL VIS [MAXN]。
18  int型ヘッド[MAXN]。
19  ボイド追加(int型のx、int型の Y、INT W)
 20  {
 21      の方法[++ TOT] .next = 頭部[X]。
22      方法[TOT] .TO = Y。
23      方法[TOT] .VALUE = W。
24      頭[X] = TOT。
25  }
 26  構造体ノード
 27  {
 28      のint DIST、ID。
29      ノード(){}
 30      ノード(int型 DIST、INTのID):DIST(DIST)、ID(ID){}
 31  }。
32  ブール 演算子 < (ノードXI、ノードYI)
 33  {
 34      リターン xi.dist> yi.dist。
35  }
 36  のintダイクストラ(int型S)
 37  {
 38      PRIORITY_QUEUE <ノード> Q。
39      のmemset(DIS、0x3fをはsizeof (DIS))。
40      のmemset(VIS、0はsizeof (VIS))。
41      q.push(ノード(0 、S))。
42の      DIS [S] =0 ;
43      ながら(!q.empty())
 44      {
 45          ノードT(q.top())。
46          q.pop()。
47          INT X = t.id。
48          場合(VIS [X])
 49          {
 50              続けます51          }
 52          [X] = VIS 1 53          のためにint型 I =ヘッド[X]; I; I = 方法[I] .next)
 54          {
 55              INT =の方法[I] .TO。
56              なら方法>に(DIS [I] + .VALUEt.dist)
 57              {
 58                  DIS =道[へ] [I] .VALUE + t.dist。
59                  q.push(ノード(DIS)に、[します])。
60              }
 61          }
 62      }
 63  }
 64  のint main()の
 65  {
 66      のmemset(ヘッド、0はsizeof (ヘッド))。
67      のscanf(" %D%D%D "、&​​N、&M、およびK);
68      のscanf(" %D%dの"、&​​S&T)。
69      のためにint型 I = 1 ; I <= M; iは++ 70      {
 71          のscanf(" %D%D%D "、およびX&Y、&W)を。
72          追加(X、Y、W)。
73          追加(Y、X、W)。
74          のためのint型 J = 1 ; J <= K; J ++ 75          {
 76              追加(X +(J×n個)のY +(jは*のN)、W)。
77              追加(図示Y +(J×n個)、X +(jは*のN)、W)。
78              追加(X +((J- 1)* N)のY +(J×n個)、0 );
79              追加(図示Y +((J- 1)* N)、X +(J * n)が、0 );
80          }
 81      }
 82      のためのint型 i = 1 ; iが= Kを<; Iは++ 83      {
 84          追加(T +(I- 1 iがn *)* Nは、T +、0 );
85      }
 86      ダイクストラ(S);
87      のprintf(" %dの"、DIS [T + K *のN])。
88   }

 

おすすめ

転載: www.cnblogs.com/2529102757ab/p/11502973.html