标签:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 20021 | Accepted: 8497 |
Description
Input
Output
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
Source
题意:求自身到自身的最大转换率。
最简单的方法就是floryd算法变形,求最大路径后,求最大环,看它是否满足条件。
每一个结点都必须有到自身的环(不甚清楚原因)。
注意:该double的地方一定不能为int,切记!!!
#include<iostream> #include<cstdio> #include<map> #include<string> #include<cstring> using namespace std; const int inf=1e6; //无限大 int n;//货币种类 int m;//兑换方式 map<string,int>f; //建立一个 使字符串与整数有一一对应关系 的容器f,以便利用邻接矩阵存储数据 double rate; char str[50],str1[50],str2[50]; double dist[31][31]; int main() { int cases=0; for(;;) { memset(dist,inf,sizeof(dist)); cin>>n; if(!n) return 0; for(int i=1;i<=n;i++){ cin>>str; f[str]=i; //将输入的货币从1到n依次编号 dist[i][i]=1; //到自身的转换率默认为1,但通过floyd可能会被改变 }//有向图的顶点(一般)存在环 cin>>m; for(int i=1;i<=m;i++){ cin>>str1>>rate>>str2; dist[f[str1]][f[str2]]=rate; //构造图 } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(dist[i][j]<dist[i][k]*dist[k][j])//变形的最大路径,变"+"为"*" dist[i][j]=dist[i][k]*dist[k][j]; int flag=0; for(int i=1;i<=n;i++) if(dist[i][i]>1){ flag=1;break; } if(flag) cout<<"Case "<<++cases<<": Yes"<<endl; else cout<<"Case "<<++cases<<": No"<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/shenben/p/5628215.html