poj 2240 Arbitrage

本文介绍了一道经典的货币兑换问题,利用Floyd算法解决是否存在获利交易路径的问题,并给出了完整的C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:

  http://poj.org/problem?id=2240

题目描述:

  给n种货币,给m个货币间的汇率,问能不能通过货币之间的转化而获得利益,

解题思路:

  由题意知,这个题不止求一条路径,所以最适合就是选择floyd去解决这个题目,判断map[i][i]有没有大于1的值

ps:floyd模板题目。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 #include <iostream>
 6 using namespace std;
 7 #define maxn 35
 8 char name[maxn][maxn];//各种货币的名字
 9 double map[maxn][maxn];//map[i][j]i-->j的汇率
10 int n;
11 
12 void init ();
13 int find (char str[]);
14 void floyd ();
15 
16 int main ()
17 {
18     int m, i, j, k = 0;
19     double s;
20     char str1[maxn], str2[maxn];
21 
22     while (scanf ("%d", &n), n)
23     {
24         init();
25         for (i=0; i<n; i++)
26             scanf ("%s", name[i]);
27         scanf ("%d", &m);
28         while (m --)
29         {
30             scanf ("%s %lf %s", str1, &s, str2);
31             int a = find (str1);
32             int b = find (str2);
33             map[a][b] = s;
34         }
35         floyd();
36         m = 0;
37         for (i=0; i<n; i++)
38                 if (map[i][i] > 1)
39                     m = 1;
40         if ( m )
41             printf ("Case %d: Yes\n", ++k);
42         else
43             printf ("Case %d: No\n", ++k);
44     }
45     return 0;
46 }
47 
48 void init ()//初始化为一
49 {
50     int i, j;
51     for (i=0; i<n; i++)
52         for (j=0; j<n; j++)
53             map[i][j] = 1;
54 }
55 int find (char str[])
56 {
57     int i;
58     for (i=0; i<n; i++)
59         if (!strcmp(name[i], str))
60             return i;
61 }
62 void floyd ()
63 {
64     int i, j, k;
65     for (i=0; i<n; i++)
66         for (k=0; k<n; k++)
67             for (j=0; j<n; j++)
68                 map[i][j] = max (map[i][j], map[i][k]*map[k][j]);
69 }

 

转载于:https://www.cnblogs.com/alihenaixiao/p/4224664.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值