羅区P1807最長の道路_NOIガイド2010増加(07)

タイトル説明

n個の頂点が非巡回グラフ、nはコードG 1の各頂点に向かうとGをさせ、そしてG iが<jの場合にエッジがある場合。アルゴリズムは、G <1、N>との間の最長パスを計算するように設計w(i、j)は辺の長さ、のために提供。

入力形式

点Aから点Bへの2つの整数longest.in入力ファイルの最初の行M及びN、頂点が3つの整数、(b)にライン毎のエッジであり、m、M次の行を表し、Vは(表し辺の長さVの側面は、)がポイント。

出力フォーマット

出力ファイルlongest.out、整数、すなわち、nが1の間の最長経路1との間には通信がnに存在しない場合、出力-1。

 

ソリューション:負右側があるので、SPFAは最長の道を求めているようすることができます。

1の#include <cstdioを>
 2の#include <iostreamの>
 3の#include <CStringの>
 4の#include <アルゴリズム>
 5の#include <キュー>
 6  の#define MAXN 1505年
 7  の#define INF 0x3ffff
 8  
9  使用して 名前空間STDを、
10  
11  構造体ノード
 12  {
 13      のint 編、LEN、NXT。
14  }。
15ノードのエッジ[ 50005 ]。
16  INT 最初の[MAXN]、DIS [MAXN]、CNT、N、M。
17  BOOL VIS [MAXN]。
18 
19インラインボイド add_edge(INT S、INT E、int型D)
 20  {
 21      CNT ++ 22      エッジ【CNTは] = .ED Eと、
23      エッジ[CNT] .LEN = D。
24      エッジ= [CNT] .nxt 最初の[S]。
25      最初の[S] = CNT。
26      リターン;
27  }
 28  
29キュー< INT > Q。
30インラインボイド spfa(int型ST)の
 31  {
 32      int型 i = 1 ; iがn = <; iは++ 33          VIS [I] = 、DIS [I] = - INF。
34      q.push(ST)。VIS [ST]は= ;
35の      DIS [ST] = 0 ;
36      ながら(!q.empty())
 37      {
 38          INT P = q.front()。q.pop();
39          VIS [P] = 40          のために(登録int型 ; I I = I =最初の[P] エッジ[I] .nxt)
 41          {
 42              INT E = エッジ[i]は.ED。
43              int型 D = エッジ[I] .LEN。
44              INT newdで= DIS [P] + D。
45              であれば(newdで> DIS [E])
 46              {
 47                  DIS [E] = newdで。
48                  もし(!VIS [E])q.push(E);
49              }
 50          }
 51      }
 52      リターン53  }
 54  
55  のint main()の
 56  {
 57      のscanf(" %D%dの"、&​​N、&M)。
58      のための(登録をint i = 1 ; I <= M; iが++ 59      {
 60          INT S、E、Dと、
61          のscanf(" %D%D%D "、&​​S、&E&D)
62          add_edge(S、E、D)。
63      }
 64      spfa(1 )。
65      であれば(DIS [N] == - INF)のprintf(" -1の\ n " );
66      他ののprintf(" %dの" 、DIS [N])。
67      リターン 0 ;
68 }

 

おすすめ

転載: www.cnblogs.com/Hoyoak/p/11427477.html