Arbitrage - poj 2240 (Bellman-ford)

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 17374   Accepted: 7312

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 French francs, and 1 French franc buys 0.21 US dollar. Then, by converting currencies, a clever trader can start with 1 US dollar and buy 0.5 * 10.0 * 0.21 = 1.05 US dollars, making a profit of 5 percent.

Your job is to write a program that takes a list of currency exchange rates as input and then determines whether arbitrage is possible or not.

Input

The input will contain one or more test cases. Om the first line of each test case there is an integer n (1<=n<=30), representing the number of different currencies. The next n lines each contain the name of one currency. Within a name no spaces will appear. The next line contains one integer m, representing the length of the table to follow. The last m lines each contain the name ci of a source currency, a real number rij which represents the exchange rate from ci to cj and a name cj of the destination currency. Exchanges which do not appear in the table are impossible. 
Test cases are separated from each other by a blank line. Input is terminated by a value of zero (0) for n.

Output

For each test case, print one line telling whether arbitrage is possible or not in the format "Case case: Yes" respectively "Case case: No".

Sample Input

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这题较简单,使用bellman-ford算法就可以了,注意输出,我因为输出WA几次
 1 #include <iostream>
 2 #include<map>
 3 #include<string.h>
 4 using namespace std;
 5 struct edge{
 6     int u,v;
 7     float rate;
 8 } e[40*40];
 9 int cur_num,edge_num;
10 float dis[40];
11 map<string,int> mp;
12 int Bellman_ford(int c){
13     memset(dis,0,30*sizeof(float));
14     dis[c]=1.0;
15     for(int i=0;i<cur_num;i++){
16         for(int j=0;j<edge_num;j++){
17             if(dis[e[j].v]<dis[e[j].u]*e[j].rate){
18                 dis[e[j].v]=dis[e[j].u]*e[j].rate;
19             }
20         }
21     }
22     if(dis[c]>1.0)
23         return 1;
24     else
25         return 0;
26 }
27 int main() {
28     int count=0;
29     cin>>cur_num;
30     while(cur_num){
31         mp.clear();
32         for(int i=0;i<cur_num;i++){
33             string s;
34             cin>>s;
35             mp[s]=i;
36         }
37         cin>>edge_num;
38         for(int i=0;i<edge_num;i++){
39             string s1,s2;
40             float rate;
41             cin>>s1>>rate>>s2;
42             e[i].u=mp[s1];
43             e[i].v=mp[s2];
44             e[i].rate=rate;
45         }
46         int flag=0;
47         for(int i=0;i<cur_num;i++){
48             flag=Bellman_ford(i);
49             if(flag)
50                 break;
51         }
52
53         if(flag)
54             cout<<"Case "<<++count<<": Yes"<<endl;
55         else
56             cout<<"Case "<<++count<<": No"<<endl;
57         cin>>cur_num;
58     }
59     return 0;
60 }
时间: 2024-11-04 09:39:24

Arbitrage - poj 2240 (Bellman-ford)的相关文章

Arbitrage POJ 2240

http://poj.org/problem?id=2240 题意:现你有N种货币,在进行货币进行兑换后,最终仍需兑换成原本货币,若其中某一种货币增加了,就输出“Yes”,否则输出“No”. 一开始TLE了, 因为 return 1 的位置放错了.. 一开始没咋想,直接放到最后判断了... #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include

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(Bellman-Ford)

POJ 2240 -- Arbitrage(Bellman-Ford) 题意: 已知n种货币,以及m种货币汇率及方式,问能否通过货币转换,使得财富增加. Bellman-ford 算法: 一个具有n个顶点的图如果不存在环,则从顶点x,到顶点y,最多经过n-1条边(要考虑连通性,每个顶点最多经过 1 次),因此 x 到 y 的最短路 最多经过 n - 1 次松弛操作(就是更新长度)就应该出现,如果第 n 次松弛还可以得到最优,那么这个图就肯定是存在环了(直接用Dijkstra 就无法得到最优的,环

POJ 1860 Currency Exchange (Bellman ford)

Currency Exchange Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 22405   Accepted: 8095 Description Several currency exchange points are working in our city. Let us suppose that each point specializes in two particular currencies and pe

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 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14832   Accepted: 6255 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

ACM/ICPC 之 最短路径-Bellman Ford范例(POJ1556-POJ2240)

两道Bellman Ford解最短路的范例,Bellman Ford只是一种最短路的方法,两道都可以用dijkstra, SPFA做. Bellman Ford解法是将每条边遍历一次,遍历一次所有边可以求得一点到任意一点经过一条边的最短路,遍历两次可以求得一点到任意一点经过两条边的最短路...如 此反复,当遍历m次所有边后,则可以求得一点到任意一点经过m条边后的最短路(有点类似离散数学中邻接矩阵的连通性判定) POJ1556-The Doors 初学就先看POJ2240吧 题意:求从(0,5)到

poj 3259(bellman最短路径)

Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 30169   Accepted: 10914 Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way p