トピックへのリンク:https://vjudge.net/problem/POJ-3268
質問の意味:スタートラインを点Xで、牛以外の点はパーティーにXを指すようにして、バック点Xからその地点まで、パスは一方通行で、すべての牛は、最短経路を取る必要があります
最長ですべての牛を行くための最短の道を探します。
(コードこれで直接見ては、ほとんど変更それ、および他のボードダイクストラです)
1の#include <iostreamの> 2の#include <CStringの> 3の#include <アルゴリズム> 4の#include <cstdioを> 5の#include < ストリング > 6 使って 名前空間STD。 7 8のtypedef 長い 長LL。 9 の#define 1 - INF(1LL << 30) 10 の#define(私は++; iが=(K)<I =(J)INT)のための担当者(I、J、K) 11 の#defineのrep __(I、Jを、 k)はのために(INT I =(j)は、iが<(K); I ++) 12 の#defineあたり(i、j、k)のための(iは=(J INT); I> =(K); i--) 13 の#define__あたり(I、J、K)のための(I =(J)がINT; I>(K); i--) 14 15 のconst int型 N = 1010 。 16 INT G [N] [N]。 17 BOOL VIS [N]。 18 INT DIS1 [N]。 19 INT DIS2 [N]。 20 INTのU、V、W。 21 int型N、M、X。 22 23 ボイドのinit(){ 24 25 担当者(I、1、N)VIS [I] = 偽。 26 担当者(I、1、n)の担当者(J、1 、N){ 27 もし(I == j)のG [I] [J] = 0 ; 28 他 G [I] [J] = INF。 29 } 30 } 31 32 空隙入力(){ 33 34 担当者(I、1 、M){ 35 CIN >> U >> V >> W。 36 であれば(G [U] [V]> W)G [U] [V] = W。 37 } 38 } 39 40 ボイドダイクストラ(){ 41 42 ///////////////////////////////////// //////////////////// / 43 // (1)第一部分 44 REP(I、1、N-)DIS1 [I] G = [I] [X]; // DIS []が最短距離X市ポイントに格納されている 45 VIS [X]は= trueに、 46は 47 REP(I 、2 、N-){ 48 49 INT X = - 1。; 50 INT W = INF; 51は、 52である REP(J、1 、N-){ 53が IF(VIS [J] && W> DIS1 [J])W = DIS1! [X = J]; 54れる } 55は、 IF(X == - 。1)続け、 56は 57である VIS [X] =trueに、 58 REP(K、1 N-、){ 59 // X kを指すように点kからの距離がポイントツーポイントxに点Xからの距離よりも大きい場合にXプラス距離がDIS次に更新[]アレイ 60 IF(VIS! [K] && DIS1 [K]> DIS1 [X] + G [K] [X]){ 61は DIS1 [K] = DIS1 [X] + G [K] [X]; 62である } 63れる } 64 } 65 66 // REP COUT << DIS1 [I] << ENDL(I 1、N-を,.); 67 68 /////////////////////////// ///////////////////////////////// 69 // (2)第二の部分は、正確に同一のダイクストラボード 70 REP( I、1)N- VIS [I] =偽; 71 担当者(I、1、N)DIS2 [I] = G [X] [I]。 72 VIS [X] = 真。 73 74 担当者(I、2 、n)は{ 75 INT X = - 1 。 76 INT = W INF。 77 78 担当者(J、1 、N){ 79 であれば(VIS [J] &&> DIS2 W [J]!)= DIS2 [X = W J]。 80 } 81 82 であれば(X == - 1)続けます。 83 84 VIS [X] = trueに、 85 REP(K、1 、N-){ 86 IF(!VIS [K] && DIS2 [K]> DIS2 [X] + {G [X] [K]) 87 DIS2 [K] DIS2 = [X] + G [X] [K]; 88 } 89 } 90 } 91が INT ANS = 0 ; 92 93 // 前後ライン一緒に、最長のラウンドの選択は、答えは 94 REP( I、1、N-)IF(= X-I)= maxのANS(ANS、DIS1 [I] +!DIS2 [I]); 95 96 COUT ANS << << ENDL。 97 } 98 99 INT メイン(){ 100の 101 IOS :: sync_with_stdio(偽)。 102 cin.tie(0 )。 103 104 CIN >> N >> M >> X。 105 106 のinit(); 107 入力()。 108 ダイクストラ()。 109 110 GETCHAR(); GETCHAR()。 111 戻り 0 ; 112 }