POJ2240汇率转化计算

本文介绍了一种使用图算法解决货币兑换问题的方法。通过构建物品间的转换图并利用 Floyd 算法,判断是否存在通过一系列货币兑换操作使得初始货币价值增加的情况。

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

/*题意:几种不同的物品可以互相交换,但是交换的数量不同
比如:
1 单位 US        换 0.5  单位 British 
1 单位 British   换 10.0 单位 French 
1 单位 French    换 0.21 单位 US

现在我们可以用    1单位US      换 0.5  单位British;
再用这         0.5单位British 换 5    单位French
再用             5单位French  换 1.05 单位US
那么一开始的1单位的US现在就变成了1.05单位US;
获利0.05US

题目给出所有可供交换的物品和两种可以交换的物品之间的交换价格
问是否可以通过交换获利
*/

/*题解:先用map映照把不同的物品编号,再存入邻接矩阵
邻接矩阵必须先初始化
然后用floyd求出各个物品可以通过交换得到的最大值,
再找出每个物品自身的交换后的价值,如果大于原来的价值就输出Yes;
否则输出No
*/


#include<stdio.h>
#include<map>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    map<string,int>m;               //map映照容器,用字符串映照数字

	int t,n,ans;
	int flag;
	int r=1;

	double mp[222][222];            //邻接矩阵用double型储存
	double x;

    char str1[222],str2[222];       
    char str[222];


	while(scanf("%d",&n) && n)
	{
	    for(int i=1; i<=n; i++)
        {
            scanf("%s",str);
            m[str] = i;                         //输入字符串,确定映照的数字
        }

        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
            {
                if(i==j)
                    mp[i][j] = 0.00;             //初始化邻接矩阵mp
                else
                    mp[i][j] = 1.00;
            }
        }

       scanf("%d",&t);

       for(int i=0; i<t; i++)
       {
           scanf("%s %lf %s",&str1,&x,&str2);       //储存路径
               mp[m[str1]][m[str2]] = x;
       }
    
    //floyd
       for(int i=1; i<=n; i++)
       {
          for(int j=1; j<=n; j++)
          {
            for(int k=1; k<=n; k++)
            {
              if(mp[j][k] < mp[j][i] * mp[i][k])
              {
                  mp[j][k] = mp[j][i]*mp[i][k];
              }
            }
          }
       }
       printf("Case %d: ",r++);
        flag = 0;
        for(int i=1; i<=n; i++)
        {
            if(mp[i][i] > 1)                    //对比交换后的价值是否变大
            {
                flag = 1;
                printf("Yes\n");
                break;
            }
        }

        if(!flag)
            printf("No\n");
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值