侧边栏

POJ-2240 Arbitrage

链接: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 }

 

posted @ 2020-04-24 22:14  晴人  阅读(99)  评论(0编辑  收藏  举报