POJ - 2240裁定(ベルマン・フォード、右ループの問題です)

質問の意味:Nあなた為替通貨のレートと名前、m個の通貨、交換を与えると方法があるかどうかを尋ね、最初から通貨お金の最後に、多くの交換が完了より多くのケース

アイデア:為替の問題は、一般的に正のループを発行する権利を求めている、とPOJ-1860は、本質的に同じ問題であり、我々は最後の意志ならば、M回の緩和操作によってサイクルの各点について、決定するためにベルマン - フォード法を使用することができます回路は右が表示されていることを示す、変更

また、通貨の名前はマップとマップを見ることです

 

完全なコード:

#include <iostreamの> 
する#include <CStringの> 
する#include <アルゴリズム> 
の#include <cstdioを> 
する#include <地図>
 使用して 名前空間STD。
const  int型 MAXE = 2500 ;
const  int型 MAXN = 50 ;
INTのN、M。
マップ < 文字列int型 > G;
int型のトップ。
ダブルDIS [MAXN]。
構造体のエッジ{
     INT  からの、。
    ダブルのval; 
}エッジ[MAXE]。

無効アドオン(INT  からINT、に二重のVal){ 
    エッジ[トップ]。= から
    エッジ[トップ] .TO = であり; 
    エッジ【トップ ++]ヴァル= ヴァル; 
} BOOLベルマン(int型の){ 
    memsetの(DIS、0はsizeof DIS)。
    DIS [S] = 1 以下のためにint型 i = 1 ; iが<= N; iは++ ){
         ためのint型 J = 0 ;トップJ <; J ++ ){
             もし
(DIS [エッジ[J] .TO <DIS [エッジ[J] から ] * エッジ[J] .val)
                DIS [エッジ[J] .TO] = DIS [エッジ[J] から ] * エッジ[ J] .val; 
        } 
    } 
    IF(DIS [S]> 1.0 リターン trueにそれ以外の
        リターン falseに; 
} 
 
int型メイン(ボイド){
     int型 CNT = 0 ;
     一方、(N-CIN >> && N-){ 
        トップ = 0 ; 
        G.クリア(); // TODO:私はそれが何の事はないんだと思う
        文字列S、S1、S2は、
         のためにINT I = 1。 ;私は<= N-; Iは++ 
            CIN >> S、G [S] = I; 
        CIN >> M、
         ダブルレート;
         のためint型 I = 0 ; I <M ; I ++ ){ 
            CIN >>レート>> S1 S2、
            追加(G [S1]、G [S2]、レート); 
        } 
        int型Iは、
         のための(I = 1 I ++)は、I <= N; // なぜなら出力「YES」、ので、ここで私たちはいずれかのノード上のすべてのノードをたどることができます右のリングがあります。
            IF (ベルマン(I))
                 BREAK ;
        裁判所未満<< " ケース" << ++ CNT << " " ;
        もし(I == N + 1 
            COUT << " いいえ" << ENDL。
        他の
            裁判所未満 << " はい" << てendl; 
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/Tianwell/p/11297407.html