質問の意味: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 。 }