羅区P2384最短経路問題の解決

トピックの背景

犬の腐った兄弟最も短絡、突然、機知に富んだ試験ボッシュを行い、ボッシュはボッシュが住んでテストを期待していなかった...あなたはそれを解決することができますか?

彼はあなたに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 }

 

 

おすすめ

転載: www.cnblogs.com/zealsoft/p/11530015.html