链接:http://poj.org/problem?id=2240
题意:给n个货币,给定m对货币间的汇率,问是否存在一种货币,通过不停的兑换,最后使得自己的钱变多
思路:边权为汇率的有向图,在图中找到一个环,满足边权累乘大于1,floyd算法
代码:
1 #include<iostream> 2 #include<string> 3 #include<map> 4 #include<cstdio> 5 #include<cstring> 6 #define inf 0x7ffffff 7 #define ms(a) memset(a,0,sizeof(a)) 8 using namespace std; 9 typedef long long ll; 10 11 const int M = int(1e2)*5 + 5; 12 const int mod = int(1e9) + 7; 13 14 15 int n,m; 16 17 double dis[M][M]; 18 void init(){ 19 for(int i=1;i<=n;i++){ 20 for(int j=1;j<=n;j++){ 21 if(i==j) dis[i][j]=1.0; 22 else dis[i][j]=0; 23 } 24 } 25 } 26 27 void floyd(){ 28 for(int k=1;k<=n;k++){ 29 for(int i=1;i<=n;i++){ 30 for(int j=1;j<=n;j++){ 31 dis[i][j]=max(dis[i][j],dis[i][k]*dis[k][j]); 32 } 33 } 34 } 35 36 37 } 38 39 map<string,int> ma; 40 int k=1; 41 int main(){ 42 while(cin>>n && n){ 43 ms(dis); 44 init(); 45 ma.clear(); 46 for(int i=1;i<=n;i++){ 47 string s; 48 cin>>s; 49 ma[s]=i; 50 } 51 cin>>m; 52 for(int i=0;i<m;i++){ 53 string s,e; 54 double w; 55 cin>>s>>w>>e; 56 dis[ma[s]][ma[e]]=w; 57 } 58 floyd(); 59 cout<<"Case "<<k<<": "; 60 61 int tot=0; 62 for(int i=1;i<=n;i++){ 63 if(dis[i][i]>1) tot++; 64 } 65 if(tot==0) cout<<"No"<<endl; 66 else cout<<"Yes"<<endl; 67 k++; 68 } 69 return 0; 70 }