トピックの背景
犬の腐った兄弟最も短絡、突然、機知に富んだ試験ボッシュを行い、ボッシュはボッシュが住んでテストを期待していなかった...あなたはそれを解決することができますか?
彼はあなたに10%100000000000000000000000000000000000金wを与えます
タイトル説明
グラフを有向加重n個の点を考慮すると、単純なパスの最小辺の重みの積の1からnまでの経路を見つけます。
入力形式
最初の行は、mは、mはn個の点エッジの総数を表し、nは2つの整数を読み込みます。3つの正整数x、y、zの次のmライン、Zの右側縁があるようにYを指すように点Xを表します。
出力フォーマット
答えは大きな可能性があるため、出力は、プロットの右側を求めているのパスで示さのみ1行が含まれ、その犬の兄弟は、優雅に9987のアナログ残りにそれあなたが出力しましょう。
もちろん、数はナンセンスwがあります
//謝fyszzhouzj補正ワット
データの20%を、N <= 10。
データの100%に、N <= 1000、M <= 1000000。右側には、1万人以上ではありません。
サンプル入力と出力
入力#1
3 3 1 2 3 2 3 3 1 3 10
出力#1
9
説明/ヒント
ヨーヨーワットを書くために良い見てみましょう
問題の解決策
この質問と最も典型的には短いの最大の違いは、それが計算されていないと、エッジの右側には、エッジの重みが2の製品であることです。コードは以下の通りです。その結果、エラーとなり、直接金型縁9987に結果が0を生成した場合のみデータピットは、9987とすることができるエッジの長さの2つのテストケースです。このような状況でのプログラムは、特別な文だった、その結果は、金型が表示された場合、9987の結果は、金型として指定されます0です。
1の#include <iostreamの> 2の#include <キュー> 3の#include < 文字列・H> 4 5 使用 名前空間STDを、 6 7 構造体のエッジ 8 { 9 INT チョンティエン、changdu。 10 INT 次= 0 。 11 }。 12 13 INT最初の[ 2333 ]。 14 15エッジED [ 200005 ]。 16 17 のint N、M、EN。 18 19 ボイド add_edge(INT S、INT E、int型D) 20 { 21 EN ++ 。 22 編[EN] .next = 最初の[S]。 23 最初の[S] = EN。 24 編[EN] .zhongdian = E。 25 編[EN] .changdu = D。 26 } 27 28 29 のconst int型 MAXN = 100010 。 30 CONST INT INF = 0x3f3f3f3f 。 31 INT DIST [MAXN]。 32 33 BOOLの使用[MAXN]。 34 35 構造体REC 36 { 37 のint P、DIST。 38 39 REC() 40 { 41 } 42 REC(INT A、INT B) 43 44 { 45 、P =、DIST = B。 46 } 47 }。 48 49 ブール 演算子 <(CONST RECと、CONST REC&B) 50 51 { 52 リターン(a.dist> b.dist)。 53 } 54 55 PRIORITY_QUEUE <REC> ヒープ。 56 57 ボイドdijkstra_heap() 58 59 { 60 のmemset(DIST、0x3f3f、はsizeof (DIST))。 61 62 DIST [ 1 ] = 1 。 63 のために(INT A = 1 ; <= N ++ ) 64 { 65 heap.push(REC(DIST [A])); 66 } 67 のために(INT A = 1 ; <= N; ++ ) 68 { 69 ながら(使用[heap.top()P]) 70 { 71 heap.pop()。 72 } 73 REC今= heap.top()。 74 heap.pop()。 75 INT P = now.p。 76 使用[P]は= 真。 77 のためには、(int型 I =最初の[P]; I; I = ED [I] .next) 78 { 79 もし(DIST [P] * ED [I] .changdu < DIST [ED [I] .zhongdian]) 80 81 { 82 DIST [ED [I] .zhongdian] =(DIST [P] * ED [I] .changdu )%9987 。 83 であれば(DIST [ED [I] .zhongdian] == 0 ) 84 { 85 DIST [ED [I] .zhongdian] = 9987 。 86 } 87 heap.push(REC(ED [I] .zhongdian、DIST [ED [I] .zhongdian]))。 88 } 89 } 90 } 91 } 92 93 94 のint main()の 95 { 96 CIN >> N >> M。 97 のために(INT A = 1 ++; <= M ) 98 { 99 INT S、E、D。 100 CIN >> S >> E >> D。 101 add_edge(S、E、D)。 102 add_edge(E、S、D)。 103 } 104 dijkstra_heap()。 105 COUT << DIST [N] << ENDL。 106 リターン(0 )。 107 }