(SPFA+最短路变形+回路对起点的影响)Arbitrage
套利是利用貨幣匯率的差異將一種貨幣的一個(gè)單位轉(zhuǎn)換為同一貨幣的多個(gè)單位。例如,假設(shè)1美元兌0.5英鎊,1英鎊兌10.0法國(guó)法郎,1法國(guó)法郎兌0.21美元。然后,通過兌換貨幣,一個(gè)聰明的交易者可以從1美元開始購(gòu)買0.5 * 10.0 * 0.21 = 1.05美元,賺取5%的利潤(rùn)。
您的工作是編寫一個(gè)程序,該程序以貨幣匯率列表作為輸入,然后確定套利是否可能。
輸入
輸入文件將包含一個(gè)或多個(gè)測(cè)試用例。每個(gè)測(cè)試用例的第一行有一個(gè)整數(shù)n (1<=n<=30),表示不同貨幣的數(shù)量。接下來的n行每一行都包含一種貨幣的名稱。在名稱中不會(huì)出現(xiàn)空格。下一行包含一個(gè)整數(shù)m,表示接下來的表的長(zhǎng)度。最后m行分別包含源貨幣的名稱ci、表示從ci到cj的匯率的實(shí)數(shù)rij和目標(biāo)貨幣的名稱cj。不出現(xiàn)在表中的交換是不可能的。
測(cè)試用例之間用空行隔開。對(duì)于n,輸入以0(0)結(jié)束。
輸出
對(duì)于每個(gè)測(cè)試用例,用“case case: Yes”和“case case: No”的格式打印一行代碼,說明套利是否可能。
樣例輸入
3
USDollar
BritishPound
FrenchFranc
3
USDollar 0.5 BritishPound
BritishPound 10.0 FrenchFranc
FrenchFranc 0.21 USDollar
3
USDollar
BritishPound
FrenchFranc
6
USDollar 0.5 BritishPound
USDollar 4.9 FrenchFranc
BritishPound 10.0 FrenchFranc
BritishPound 1.99 USDollar
FrenchFranc 0.09 BritishPound
FrenchFranc 0.19 USDollar
0
Sample Output
Case 1: Yes
Case 2: No
分析與解答:
這題利用SPFA,但是不同于一般的SPFA。
一般我們用SPFA是給一個(gè)起點(diǎn)我們用dis[i]存起點(diǎn)到終點(diǎn)i的最短距離。
Map[a][b]=k,a換到b的匯率
Map[a][a]=1,意思是a換到a的匯率為1
dis[a]=j,起點(diǎn)換到a的匯率的最大值
先明白一個(gè)基本常識(shí),a換到b匯率為x,b換到c匯率為y,那么a換到c匯率為x*y。然而路徑是相加的
所以這個(gè)題用SPFA時(shí)候,我們初始化變了,我們判斷條件也變了,而且根據(jù)題意除了存dis數(shù)組之外,我們還需要判斷dis[start]是不是大于1
為什么dis[start]會(huì)變?這就是SPFA算法和bfs的區(qū)別,bfs是x出隊(duì)之后就不入隊(duì)了,而SPFA中,一個(gè)點(diǎn)改進(jìn)過其它的點(diǎn)之后,過了一段時(shí)間可能本身被改進(jìn)(重新入隊(duì)),于是再次用來改進(jìn)其它的點(diǎn)
參考代碼:
https://blog.csdn.net/lyhvoyage/article/details/19248927
總結(jié)
以上是生活随笔為你收集整理的(SPFA+最短路变形+回路对起点的影响)Arbitrage的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何用php写表单中的年月日,php写的
- 下一篇: java 设计char类型_JAVA中的