poj2240

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

   最简单的方法就是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;  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值