POJ 1860両替(BellmanFord修正アルゴリズムはリングを求めています)

いくつかの通貨の為替ポイントは、私たちの街で働いています。私たちは、各ポイントは2つの特定の通貨を専門とだけこれらの通貨との為替操作を実行すると仮定しましょう。通貨の同じペアに特化したいくつかのポイントが存在する場合があります。各点はBへの為替レートは、あなたが1Aのために取得するBの量であり、独自の為替レートを持っています。また、各交換ポイントはいくつかの手数料、あなたの交換作業のために支払わなければならない合計を持っています。委員会は、常にソース通貨で収集されます。 
たとえば、為替レートは29.75で、手数料は0.39であるあなたは(100から0.39)を取得します交換時点で、ロシアルーブルに100ドルを交換したい場合は* 29.75 = 2963.3975RURを。 
あなたは確かにあなたが私たちの街に対処することができますN異なる通貨があることを知っています。私たちは1からNまでの各通貨に一意の整数番号を割り当ててみましょう。-通貨それ交換、及び実際のRの数字整数AとB:各交換点は6つの数字で記述することができる  AB 、C  AB 、R  BA  およびC  BA  為替レート及び手数料にそれぞれB及びBに交換します- 。 
ニックは通貨Sでいくつかのお金を持っており、彼は何とか、いくつかの交換作業の後、彼の資本を増やすことができるかどうか不思議。もちろん、彼は最終的に通貨Sに自分のお金を持って望んでいます。この困難な質問に答えるために彼を助けます。彼の操作をしながらニックは常にお金の非負の和を持っている必要があります。 

入力

-通貨の数、M -交換ポイント数、S -ニックを有する通貨およびVの数-彼が持っている通貨単位の量N:入力の最初の行は、4つの数字を含んでいます。対応する交換点の説明- -順上で指定の次のMラインが6つの番号をそれぞれ含みます。数値は、1つ以上のスペースで区切られます。1 <= S <= N <= 100、1 <= M <= 100、Vは実数、0 <= V <= 10  3 。 
小数点以下せいぜい2桁の所与為替レートおよび手数料が実数である各点について、10  -2 <=レート<= 10  2 、0 <=手数料<= 10  2 。 
何の交換ポイントが、この順序で複数回使用されていない場合、私たちは、単純な為替操作のいくつかのシーケンスを呼ぶことにしましょう。あなたは、最後に合計の数値の比をとることができるし、為替業務のいずれかの簡単なシーケンスの始めに10未満となります  4 。 

出力

ニックは、出力ファイルに彼の富、出力YES、その他の場合の出力NOを増やすことができます。

サンプル入力

3 2 1 20.0 
1 2 1.00 1.00 1.00 1.00 
2 1.10 3 1.00 1.10 1.00

サンプル出力

3 2 1 20.0 
1 2 1.00 1.00 1.00 1.00 
2 1.10 3 1.00 1.10 1.00

サンプル出力

はい

 

あなたは100A通貨を使用する場合、料金を必要と為替の様々な、クレジットがシンクの間で交換することができ、存在する
Bに交換コインB、Aは、為替レートは29.75で、料金はあなたが得ることができる、0.39である
(100-- 0.39) * 29.75 = 2963.3975 Bクレジット。最終後のQ sの為替量
増加させることができた数の通貨額
のお金のやり取りが何度も繰り返すことができるので、我々はそこにいるかどうか確認する必要があり
、右ループ、sは、得られる量を増加させる
方法をアライメントループそれは正しいですか?(正の重み回路は、このループでは、エネルギー緩和増加していることができる頂点の重み値)

キーを使用して、ベルマン-フォード法を逆の


被験者がベルマンフォード負側であるので、使用することができるので、単一始点最短経路アルゴリズムアルゴリズムは、
オリジナルのベルマンフォードは負のリングを見つけるために使用することができ、この問題を鳴らすために使用されるものを求めている改善する必要がある

の通貨は、地図上の点で
はなく、二つの通貨間のリングの交換があるマップ上の「交換ポイント」数にMは両側性である「償還」
のみ注目その金額は、Kの重量のために、すなわち、交換することなく、Vである所有重量、
およびBの重量の値(V-CAB)*ラブ
この質問の質問が正確であるので、この質問は、「最大パスを求めて」、その理由は、「最小経路を求めている」として分類されている
最大の正の無制限緩和のことができるようにしようとしている、緩和条件ベルマン・フォードアルゴリズムの反対右の道は、
まだ問題を解決するためにベルマン・フォードのアイデアを使用することができます。
したがって、初期化D(S)は、ソースからの他の店舗(重量)にV及び距離が無限小に初期化され=(0)、
Sは、他の点まで継続することができる距離が大きくなると、説明した最大パスがあります


1の#include <stdio.hの>
 2の#include <アルゴリズム>
 3の#include <iostreamの>
 4の#include <stdbool.h>
 5の#include <STDLIB.H>
 6の#include < ストリング >
 7の#include < 文字列・H>
 8の#include <math.h>の
 9の#include <ベクトル>
 10の#include <キュー>
 11の#include <スタック>
 12の#include <地図>
13  
14  の#define INF 0x3f3f3f3f
 15  の#define LL長い長い
 16  の#define MAXN 300
 17  使用 名前空間STD;
 18である 
。19  ダブル[MAXN] DIST;
 20である 
21は int型、NODENUM edgenum;
 22である INT S;
 23れる ダブルV;
 24  INT D [MAXN] [ 2 ];   // 始点と終点
25  ダブル C [MAXN] [ 2 ]。   // 交換手数料及び
26は 
27  BOOL Bellman_fold()
 28  {
 29      のためにINT I = 1 ; Iは<= NODENUMは、I ++は30          DIST [I] = 0 ;
31      DIST [S] = V。
32      のためにint型 I = 1 ; I <NODENUM; iは++ 33      {
 34          のためにINT J = 1 ; J <= edgenum; J ++ 35          {
 36              INT U = D [j] [ 0 ]。
37              のint V = D [J] [ 1 ]。
38              であれば(DIST [V] <(DIST [U] -C [J] [ 1 ])* C [j] [ 0 ])
 39              {
 40                  DIST [V] =(DIST [U] -C [J] [ 1 ])* C [J] [0 ]。
41              }
 42          }
 43      }
 44      のためのint型 I = 1 ; I <= edgenum; iは++ 45      {
 46          INT U = D [i]が[ 0 ]。
47          のint V = D [i]を[ 1 ]。
48          であれば(DIST [V] <(DIST [U] -C [I] [ 1 ])* C [i]が[ 0 ])
 49          {
 50              リターン 51          }
 52      }
 53      リターン 54  }
 55  
56  のint main()の
 57  {
 58      // freopenは( "../ in.txt"、 "R"、STDIN)。
59      一方(〜のscanf(" %D%D%D%LF "、NODENUM、&edgenum、&S、&&V))
 60      {
 61          int型A、B。
62          ダブルC、D、E、F。
63          のint i = 0 ;
64          一方(edgenum-- 65          {
 66              のscanf(" %D%D%LF%LF%LF%LF "、&​​、&B、&C、&D、およびE、およびF)。
             I ++ ;
68              D [i]が[ 0 ] = 69              D [i]を[ 1 ] = Bと、
70              C [i]が[ 0 ] = Cと、
71              C [I] [ 1 ] = Dと、
72              私は++します;
73              D [i]が[ 0 ] = Bと、
74              D [i]を[ 1 ] = 75              C [i]が[ 0 ] = E。
76              C [I] [ 1 ] = Fと、
77          }
 78          edgenum = I。
79          であれば(Bellman_fold())
 80              のprintf(" YES \ n " );
81          他の
82              のprintf(" NO \ nを" );
83      }
 84      リターン 0 85 }
アッカーマン

 

おすすめ

転載: www.cnblogs.com/-Ackerman/p/11267340.html