poj1860(ベルマン・フォード)

私たちの街は、為替のいくつかのポイントがあります。私たちは各点は特別な二つの通貨を交換することができていることを前提としましょう。同じ為替を専門にいくつかのポイントがあるかもしれません。各点は、独自の通貨、BにAの為替レートを持っており、Bは、あなたの1Aの数です。同時に、各為替手数料のいくつかのポイントがあり、合計があなたの操作を交換したいです。お金は常に手数料の源です。×29.75 = 2963.3975ルーブル - 手数料は0.39である一方で、あなたは為替レートが29.75であるロシアルーブル交換ポイントに$ 100を変更したい場合たとえば、あなたは(0.39 100)を取得します。あなたは私たちの街にあなたは異なる通貨を扱うことができることを知っている必要があります。各通貨が少ないNよりも唯一の整数で表現されてみましょう 次いで、表6の整数各スイッチング・ポイントは、説明することができる:aとbの二つの通貨の整数を表し、委員会に通貨B、Bに、委員会にB、Bに交換します。ニックは、通貨Sにいくつかのお金を持って、彼は彼の資本を高めるために、いくつかの操作(別の交換ポイントで交換)を渡したいです。もちろん、彼はまだSである。最後の手の中にお金が欲しかったです 彼はこの願望を達成することができれば、彼はこの困難な問題を解決するには、参照してください。 

入力

最初の4つの行の数、Nは、通貨の総数を表し、数M、交換点、タイプS、ニックハンドお金、数V、ニックハンドお金を、1 <= S <= N <= 100、1 <= M <= 100、Vは実数0 <= V <= 103次にM行、6つの数字、整数の各列及びBはAに、への2つの通貨、Bの交換を表しています手数料B、Bは、手数料(0 <=手数料<= 102,10-2 <=空<= 102)に、Bを交換する  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

サンプル出力

YES 


//シンプルな真の質問、またはリングの意味、増加値は、真の起源であります
書式#include <iostreamの> 
の#include <CStringの> 
の#include < 文字列 > 
の#include <アルゴリズム> 
書式#include <キュー> 
の#include <スタック> 
書式#include <stdio.hに> 
する#include <cmath> 
の#include < 文字列の.h> 含める <ベクトル> の#define LL長い長い
 使って名前空間はstdを、INT B [ 210 ] [ 2 ]、TOL。
二重 HY [ 210 ] [ 2 ]、DIS [ 110 ]。

 



INT S、整数 nは、二重V)
{ 
    ためINT iは= 1 ; iが<= N; iが++)DIS [I] = 0 ; 
    DIS [S] = V。
    INT iは= 1 ; I <= N I ++ 
    { 
        ブールフラグ= 0 INT J = 0 ; J <TOL; J ++ 
        { 
            int型の X1 = B [j] [ 0 ]、X2 = B [J] [ 1 ]。
            もし HY [j]と[ - (DIS [×2] <(DIS [X1]1 ])* HY [J] [ 0 ])
            { 
                フラグ = 1 
                DIS [X2] =(DIS [X1] - HY [J] [ 1 ])* HY [J] [ 0 ]。
            } 
        } 
        もし(フラグ== 0戻り 0 ; 
    } 
    ためINT iが= 0 ; I <TOL; I ++ 場合(DIS [B [i]を[ 1 ] <(DIS [B [i]が[ 0 ]] - HY [I] [ 1 ])* HY [ I] [ 0 ])
             のリターンを 1;
    リターン 0 ; 
} 

int型のmain()
{ 
    IOS :: sync_with_stdio()。
    ダブルV;
    整数N、M、S。
    一方、(〜のscanf(" %D%D%D%LF "、&​​N、&M、&S&V))
    { 
        TOL = 0 一方、(M-- 
        { 
            int型A1、A2。
            ダブルR1、C1、R2、C2; 
            scanf関数(" %D%D%LF%LF%LF%LF "、&​​A1、およびA2、&R1、&C1&R2、およびC2)。
            B [TOL] [ 0 ] = A1、B [TOL] [ 1 ] = A2。
            HY [TOL] [ 0 ] = R1、HY [TOL] [ 1 ] = C1。
            TOL ++ ; 
            B [TOL] [ 0 ] = A2、B [TOL] [ 1 ] = A1。
            HY [TOL] [ 0 ] = R2、HY [TOL] [ 1 ] = C2。
            TOL ++ ; 
        } 
        であれば(ベルマン(S、N、V))のprintf(" YES \ n " );
        のprintf(" NO \ N " );
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/zxybdnb/p/11939410.html