POJ 2240 -- Arbitrage(Bellman-Ford)

POJ 2240 -- Arbitrage(Bellman-Ford)

题意:

已知n种货币,以及m种货币汇率及方式,问能否通过货币转换,使得财富增加。

Bellman-ford 算法:

一个具有n个顶点的图如果不存在环,则从顶点x,到顶点y,最多经过n-1条边(要考虑连通性,每个顶点最多经过 1 次),因此 x 到 y 的最短路 最多经过 n - 1 次松弛操作(就是更新长度)就应该出现,如果第 n 次松弛还可以得到最优,那么这个图就肯定是存在环了(直接用Dijkstra 就无法得到最优的,环的存在会影响最优解是否存在)。

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 const int maxn = 50;//顶点的最大值
 5 const int maxm = 1000;//边数的最大值
 6 #define max(a,b) {(a)>(b)?(a):(b)}
 7 struct node{
 8     int ci,cj;
 9     double cij;
10 }exch[maxm];///兑换货币的路径
11
12 double dist[maxn];//源点到其他每个节点的最长路径,包括它本身
13
14 char name[maxn][20];
15 int n,m;
16 bool flag;
17 int kase = 1;
18 void solve_case(int v0)
19 {//Bellman-Ford算法:以v0为源点,求它到每个顶点(包含它本身)的最大距离
20      flag = false;
21      memset(dist,0,sizeof(dist));
22      dist[v0] = 1;
23      for(int k=1;k<=n;k++)//从dist(0)递推到dist(1)...dist(n) 进行n次松弛操作
24       {
25           for(int i=0;i<m;i++)//判断每一条边,假如他是否能使最大距离增加
26           {
27               if(dist[exch[i].ci]*exch[i].cij > dist[exch[i].cj])
28               {
29                   dist[exch[i].cj] = dist[exch[i].ci]*exch[i].cij;
30               }
31           }
32       }
33       if(dist[v0]>1.0) flag = true;
34 }
35
36 int cin_case()
37 {
38     while(cin>>n && n)
39     {
40         //输入货币的名称 ,name数组下标即为货币的编号
41         for(int i=0;i<n;i++){
42             cin>>name[i];
43         }
44         ///输入兑换货币的路径
45         cin>>m;
46         char a[20],b[20];
47         double e;
48         for(int i=0;i<m;i++)
49         {
50             cin>>a>>e>>b;
51             ///得到货币的编号
52             int k,j;
53             for(k=0;strcmp(name[k],a)!=0;k++);
54             for(j=0;strcmp(name[j],b)!=0;j++);
55             ///从k->j 汇率为e
56             exch[i].ci = k;exch[i].cj = j;exch[i].cij = e;
57         }
58         return 1;
59     }
60     return 0;
61 }
62
63 int main()
64 {
65     while(cin_case())
66     {
67         for(int i=0;i<n;i++)
68         {
69             solve_case(i);//从第i个结点出发求最长路径
70             if(flag) break;
71         }
72         if(flag) cout<<"Case "<<kase++<<": Yes"<<endl;
73         else cout<<"Case "<<kase++<<": No"<<endl;
74      }
75
76     return 0;
77  } 

原文地址:https://www.cnblogs.com/yxh-amysear/p/8489442.html

时间: 2024-10-12 03:01:50

POJ 2240 -- Arbitrage(Bellman-Ford)的相关文章

POJ 2240 Arbitrage

Bellman 求最大环. 询问货币是否纯在套汇. 假如给你 1 元,通过兑换之后 超过 1 元就是存在套汇了. 用 map 映射比较方便. #include<cstdio> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<queue> #include<map> #include<iostream>

poj 2240 Arbitrage 题解

Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 21300   Accepted: 9079 Description Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currenc

poj 2240 Arbitrage (Floyd)

链接:poj 2240 题意:首先给出N中货币,然后给出了这N种货币之间的兑换的兑换率. 如 USDollar 0.5 BritishPound 表示 :1 USDollar兑换成0.5 BritishPound. 问在这N种货币中是否存在货币经过若干次兑换后,兑换成原来的货币能够使货币量添加. 思路:本题事实上是Floyd的变形.将变换率作为构成图的路径的权值.只是构成的图是一个有向图. 最后将松弛操作变换为:if(dis[i][j]<dis[i][k]*dis[k][j]). #includ

poj 2240 Arbitrage(bellman-ford 判断正环)

http://poj.org/problem?id=2240 基本和poj 1860相同 只是把单点变成了任意点 做完1860再做这题就完全把思路套上就过了 做完才发现网上的题解都用的是floyd 不过整体思路都是大同小异吧 不过在效率上好像就低下了太多= = #include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<stack> #include<

poj 2240 Arbitrage(Bellman-Ford算法学习)

Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15806   Accepted: 6648 Description Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currenc

POJ 2240 Arbitrage(最短路 套汇)

题意  给你n种币种之间的汇率关系  判断能否形成套汇现象  即某币种多次换为其它币种再换回来结果比原来多 基础的最短路  只是加号换为了乘号 #include<cstdio> #include<cstring> #include<string> #include<map> using namespace std; map<string, int> na; const int N = 31; double d[N], rate[N][N], r;

POJ 2240 Arbitrage (spfa判环)

Arbitrage Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currency. For example, suppose that 1 US Dollar buys 0.5 British pound, 1 British pound buys 10.0 Frenc

(简单) POJ 2240 Arbitrage,SPFA。

Description Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currency. For example, suppose that 1 US Dollar buys 0.5 British pound, 1 British pound buys 10.0 Fre

[ An Ac a Day ^_^ ][kuangbin带你飞]专题四 最短路练习 POJ 2240 Arbitrage spfa求负环

题意就是问倒腾外币能不能升值 不用spfa 用其他的最短路算法也可以 松弛条件换成dist[v]<dist[u]*e[u][i].value 当然 貌似只有spfa有这个坑…… 有A  (value>1.0) A 这种情况……我的天 用Dij Floyd都只用判断如果松弛到了自己 那么一定有环 直接跳出就行 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<