タイトル説明
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 }