日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(SPFA+最短路变形+回路对起点的影响)Arbitrage

發(fā)布時(shí)間:2025/3/12 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (SPFA+最短路变形+回路对起点的影响)Arbitrage 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

套利是利用貨幣匯率的差異將一種貨幣的一個(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

#include<cstdio> #include<cstring> #include<queue> #include<map> #include<string> #include<iostream> using namespace std;const int N = 35; int n, m; double d[N], Map[N][N]; int SPFA(int start) {queue<int> q;bool inq[N];for(int i = 0; i < n; i++)d[i] = 0;memset(inq, 0, sizeof(inq));d[start] = 1;q.push(start);while(!q.empty()){int x = q.front(); q.pop();inq[x] = false;for(int i = 0; i < n; i++){if(d[i] < d[x] * Map[x][i]){d[i] = d[x] * Map[x][i];if(d[start] > 1.0)return 1;if(!inq[i]){inq[i] = true;q.push(i);}}}}return 0; }int main() {int i, j, cas = 0;char s1[35], s2[35];double s;map<string,int> mp;while(~scanf("%d",&n) && n){for(i = 0; i < n; i++){for(j = 0; j < n; j++){if(i == j)Map[i][j] = 1;elseMap[i][j] = 0;}}string name;for(i = 0; i < n; i++){cin>>name;mp[name]=i;}scanf("%d",&m);for(i = 0; i < m; i++){scanf("%s%lf%s",s1, &s, s2);Map[mp[s1]][mp[s2]] = s;}int flag = 0;for(i = 0; i < n; i++){if(SPFA(i) == 1){flag = 1;break;}}printf("Case %d: ",++cas);printf("%s\n", flag ? "Yes" : "No");}return 0; }

總結(jié)

以上是生活随笔為你收集整理的(SPFA+最短路变形+回路对起点的影响)Arbitrage的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。