トピックへのリンク:http://acm.hdu.edu.cn/showproblem.php?pid=3191
どのように多くのパスがあります
時間制限:2000/1000 MS(Javaの/その他)メモリの制限:32768分の32768 K(Javaの/その他)
の合計提出(S):2128受理提出(S):749
問題の説明
oooccc1は、職場から金曜日まで毎週月曜日に乗るために持っているソフトウェア・エンジニアです。彼は遅く寝るのが大好きので、長い期間のために、彼は最短経路でオフィスに行ってきました...時間が経つ、彼はあなたが見ることができるよう、彼は常に同じパスに乗って、いくつかの変更を持っている必要があることを発見することは退屈です。
ある日、oooccc1はアイデアを得ました!なぜ私は別のパスを取ることができますか?彼が得たすべてのタスクで疲れて、彼はそれを実行する時間を持っていません。彼の親友として、あなたは彼を助けるつもりです!
oooccc1が今早く起床しているので、彼は少し長く、最短1以上である、それらのパスを取ることが嬉しいです。正確であるためには、あなたは全ての第2の最短経路を見つけるしようとしています。
あなたは一緒に彼のオフィスを提示しoooccc'1彼の家と目標点Eの略開始点Sと、有向グラフGを与えられるであろう。そして、グラフにはサイクルがありません。あなたの仕事は、これらのパスがあり、どのように多くありますどのくらいの時間を彼に伝えることです。
ある日、oooccc1はアイデアを得ました!なぜ私は別のパスを取ることができますか?彼が得たすべてのタスクで疲れて、彼はそれを実行する時間を持っていません。彼の親友として、あなたは彼を助けるつもりです!
oooccc1が今早く起床しているので、彼は少し長く、最短1以上である、それらのパスを取ることが嬉しいです。正確であるためには、あなたは全ての第2の最短経路を見つけるしようとしています。
あなたは一緒に彼のオフィスを提示しoooccc'1彼の家と目標点Eの略開始点Sと、有向グラフGを与えられるであろう。そして、グラフにはサイクルがありません。あなたの仕事は、これらのパスがあり、どのように多くありますどのくらいの時間を彼に伝えることです。
入力
いくつかの例があります。ファイルの最後まで進みます。
それぞれの場合の最初の行は三つの整数N、M、S、E(3 <= N <= 50、0 <= S、E <N)であり、
Nは、Mは、エッジの数を表し、そのグラフ内のノードを表します、Sはスタート地点の略で、Eは、エンドポイントの略です。
次いで、M線はエッジを説明するために次のXY wです。xは開始点を表し、yはxとyとの間の長さを表しwが、別の点を表します。
すべてのノードは0からN-1にマークされています。
それぞれの場合の最初の行は三つの整数N、M、S、E(3 <= N <= 50、0 <= S、E <N)であり、
Nは、Mは、エッジの数を表し、そのグラフ内のノードを表します、Sはスタート地点の略で、Eは、エンドポイントの略です。
次いで、M線はエッジを説明するために次のXY wです。xは開始点を表し、yはxとyとの間の長さを表しwが、別の点を表します。
すべてのノードは0からN-1にマークされています。
出力
それぞれの場合、ください出力長と1つのラインのもの秒最短経路のためにカウントしました。単一のスペースで区切ります。
トピックの効果:マップへのショートバーがある回数を考えると、最後まで先頭を見つけます。
アイデア:非常にシンプルなショートバーに数回質問テンプレートのタイトルが、
WA
の議論を見ては、プライオリティキューdijのであると言うことはできませんが、私はエラーにテンプレートコードを変更する必要はありません。
コードは以下の通りであります:
1の#include <stdio.hの> 2の#include < ストリング・H> 3の#include <キュー> 4 の#define MEM(A、B)のmemset(A、B、はsizeof(a))は 5 のconst int型 MAXN = 55 。 6 のconst int型 MAXM = 5000 ; 7 CONST INT INF = 0x3f3f3f3f 。 8 使用して 名前空間はstdを、 9 10 INTのN、M、ST、ED。 11 int型ヘッド[MAXN]、CNT。 12件 のint DIS [ 2] [MAXN]、NUM [ 2 ] [MAXN]、VIS [ 2 ] [MAXN]。 13 14 構造体のエッジ 15 { 16 、INT 、隣、W。 17 }エッジ[MAXM]。 18 19 構造体ノード 20 { 21 のint ID、DIS、P。 22 ブール 演算子 <(constのノード&A)CONST 23 { 24 リターン DIS> a.dis。 25 } 26 }なし。 27 28 ボイドアドオン(int型、int型 B、INT c)の 29 { 30 CNT ++ 。 31 エッジ[CNT] .TO = B。 32 エッジ[CNT] .W = C。 33 エッジ[CNT] .next = ヘッド[A]。 34 頭[A] = CNT。 35 } 36 37 ボイドをDij() 38 { 39 MEM(VIS、0 ); 40 PRIORITY_QUEUE <ノード> Q; 41 のために(int型 I = 0を私は++; iがN < ) 42 { 43の DIS [ 0 ] [I] = DIS [ 1 ] [I] = INF。 44 NUM [ 0 ] [I] = NUM [ 1 ] [I] = 0 ; 45 } 46の DIS [ 0 ] [ST]は= 0 。 47 NUM [ 0 ] [ST]は= 1 。 48 no.p = 0、no.id = STは、= no.dis 0 。 49 Q.push(なし)。 50 ながら(!Q.empty()) 51 { 52 ノード=Q.top(); 53 Q.pop()。 54 であれば(VIS [AP] [a.id]) 55 続けます。 56 VIS [AP] [a.id] = 1 。 57 のために(int型 I =ヘッド[a.id]; I =! - 1 ; I = エッジ[I] .next) 58 { 59 INT =のエッジ[I] .TO。 60 であれば(DIS [ 0 ] [する]> DIS [AP] [a.id] + エッジ[I] .W) 61 { 62の DIS [ 1 ] [へ] [=のDIS 0 ] [します]。 63 DIS [ 0 ] [する] = DIS [AP] [a.id] + エッジ[I] .W。 64 NUM [ 1 ] [する] = NUM [ 0 ] [します]。 65 NUM [ 0 ] [する] = NUM [AP] [a.id]。 66 no.p = 0、no.dis = DIS [ 0 ] [する]、no.id = であり; 67 Q.push(なし)。 68 no.p = 1、no.dis = DIS [ 1 ] [する]、no.id = であり; 69 Q.push(NO)。 70 } 71 、他の 場合(DIS [ 0 ] [する] == DIS [AP] [a.id] + エッジ[i]は.W) 72 NUM [ 0 ] [する] + = NUM [AP] [a.id]。 73 他の 場合(DIS [ 1 ] [する]> DIS [AP] [a.id] + エッジ[I] .W) 74 { 75の DIS [ 1 ] [する] =のDIS [AP] [a.id] + エッジ[I] .W。 76 NUM [ 1 ] [する] = NUM [AP] [a.id]。 77 no.p = 1、no.dis = DIS [ 1 ] [する]、no.id = であり; 78 Q.push(NO)。 79 } 80 そう であれば(DIS [ 1 ] [する] == DIS [AP] [a.id] + エッジ[i]は.W) 81 NUM [ 1 ] [する] + = NUM [AP] [a.id ]; 82 } 83 } 84 } 85 86 のint main()の 87 { 88 ながら(scanf関数(" %D%D%D%D "、&N、&M、&ST&ED)=!EOF) 89 { 90 MEM(頭、 - 1)、CNT = 0 。 91 のために(int型 I = 1 ; I <= M。私は++ ) 92 { 93 int型 A、B、C。// 有向图 94 のscanf(" %D%D%D "、&A、&B、&C)。 95 追加(A、B、C)。 96 } 97 をDij()。 98 のprintf(" %D%D \ n "、DIS [ 1 ] [編]、NUM [ 1 ] [ED])。 99 } 100 戻り 0 ; 101 }