poj2240

转载 2015年11月18日 22:44:33

题意:求自身到自身的最大转换率。

   最简单的方法就是floryd算法变形,求最大路径后,求最大环,看它是否满足条件。

   每一个结点都必须有到自身的环(不甚清楚原因)。

注意:该double的地方一定不能为int,切记!!!


 

 

  1. #include <iostream>  

  2. #include<map>  

  3. #include<string>  

  4. using namespace std;  

  5.   

  6. const int inf=10000;      //无限大  

  7. int n;      //货币种类  

  8. int m;      //兑换方式  

  9.   

  10. map<string,int>STL;     //建立一个 使字符串与整数有一一对应关系 的容器STL,以便利用邻接矩阵存储数据  

  11.   

  12. double rate;  

  13. char str[50],str1[50],str2[50];  

  14. double dist[31][31];  

  15.   

  16. int i,j,k;  

  17.   

  18. void floyd(void)  

  19. {  

  20.     for(k=1;k<=n;k++)  

  21.         for(i=1;i<=n;i++)  

  22.             for(j=1;j<=n;j++)  

  23.                 if(dist[i][j] < dist[i][k] * dist[k][j])       //变形的最大路径,变"+"为"*"  

  24.                     dist[i][j] = dist[i][k] * dist[k][j];  

  25.     return;  

  26. }  

  27.   

  28. int main(void)  

  29. {  

  30.     int cases=1;  

  31.     while(cases)  

  32.     {  

  33.         /*Initial*/  

  34.   

  35.         memset(dist,inf,sizeof(dist));  

  36.   

  37.         /*Input*/  

  38.   

  39.         cin>>n;  

  40.         if(!n)break;  

  41.   

  42.         for(i=1;i<=n;i++)  

  43.         {  

  44.             cin>>str;  

  45.             STL[str]=i;          //将输入的货币从1到n依次编号  

  46.             dist[i][i]=1;        //到自身的转换率默认为1,但通过floyd可能会被改变  

  47.                                  //有向图的顶点(一般)存在环  

  48.         }  

  49.   

  50.         cin>>m;  

  51.         for(i=1;i<=m;i++)  

  52.         {  

  53.             cin>>str1>>rate>>str2;  

  54.             dist[STL[str1]][STL[str2]]=rate;      //构造图  

  55.         }  

  56.   

  57.         /*Floyd Algorithm*/  

  58.   

  59.         floyd();  

  60.   

  61.         /*Output*/  

  62.   

  63.         int flag=false;  

  64.         for(i=1;i<=n;i++)  

  65.             if(dist[i][i]>1)  

  66.             {  

  67.                 flag=true;  

  68.                 break;  

  69.             }  

  70.         if(flag)  

  71.             cout<<"Case "<<cases++<<": Yes"<<endl;  

  72.         else  

  73.             cout<<"Case "<<cases++<<": No"<<endl;  

  74.     }  

  75.     return 0;  


POJ2240-Arbitrage【Floyd】

  • 2011年07月30日 01:52
  • 7KB
  • 下载

POJ2240Arbitrage

  • 2011年09月18日 11:07
  • 33KB
  • 下载

学习贝尔曼算法(poj2240,1860,3259)

利用这三个题目学习理解了一下bellman——ford 算法 poj2240:给出不同货币之间的汇率,求是否可以通过货币的多次兑换使得最终得到的货币比开始时多。其实就是求是否存在无限增大的环。 ...

POJ 2240 - SPFA - 正权环(最大路)

1.Question: 输入n代表有n个国家 之后的n行代表n个国家的名称 输入m代表有向边的个数 之后的代表我们国家货币之间的汇率 现在求,是否存在一条回路是的我们的交换货币之后原...

POJ 2240 Arbitrage 最短路正环存在问题

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66569#problem/I 题意:Arbitrage,意思为套利交易:有多个...

POJ 2240 Arbitrage (Floyd)

题目大意 给出n种货币,以及m种对换方式的兑换率。求通过兑换能否使钱增加。 分析 dis[i][j]表示货币i兑换货币j的最大兑换率。求出所有货币的之间的最大兑换率。最后查看dis[i][j] * d...

zoj 1092||poj 2240 Arbitrage( bellman 最短路)

题意: 套汇问题,本质就是从每个点出发回到该点的值大于原来的就是存在套汇,yes or 不存在就是no 分析: 比较裸的最短路吧,额,实际上是最长距离,所以得用bellman或者floyd求解。...
  • cqlf__
  • cqlf__
  • 2012年01月15日 23:06
  • 545

POJ 2240 Arbitrage (Floyd)

也是一道资金兑换的题..直接按照比例兑就可以了考虑Floyd算法.但是Floyd稍微有些修改,加法改为乘法,使该点到其他点汇率最大最终要换回自己d[i][j]是i换j的最大汇率,而d[j][i]则是j...
  • swm8023
  • swm8023
  • 2011年07月29日 00:25
  • 464

POJ-2240-Arbitrage

Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 21407   Acc...

(诡异Floyd&自环)MZ Training 2014 #15 E题(POJ 2240)

你们见过这么诡异的FLOYD吗? 先上题。 [Description] 货币的汇率存在差异,例如,假设1美元购买0.5英镑,1英镑买10法郎,而1法国法郎买0.21美元。然后,通过转换货币,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj2240
举报原因:
原因补充:

(最多只允许输入30个字)