POJ 2240 Arbitrage

题意:给一些国家之间的货币交换汇率,问是否可以通过一些货币交换产生盈利

思路:bellman算法判断是否存在正权回路

PS:可能存在相同国家之间的货币交换、此时需要特判一下

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 const int qq=35;
 5 char country[qq][qq];
 6 double dis[qq];
 7 int n,m;
 8 struct Node
 9 {
10     int s,e;
11     double w;
12 }map[qq<<6];
13 bool bellman()
14 {
15     memset(dis,0,sizeof(dis));
16     dis[1]=1000.0;
17     for(int j,i=1;i<=n-1;++i)
18         for(j=1;j<=m;++j)
19             if(dis[map[j].e]<dis[map[j].s]*map[j].w)
20                 dis[map[j].e]=dis[map[j].s]*map[j].w;
21     for(int j=1;j<=m;++j)
22         if(dis[map[j].e]<dis[map[j].s]*map[j].w)
23             return true;
24     return false;
25 }
26 int main()
27 {
28     int k=1;
29     while(~scanf("%d",&n)&&n){
30         for(int i=1;i<=n;++i)
31             scanf("%s",country[i]);
32         scanf("%d",&m);
33         int a,b;
34         double c;
35         char s1[qq],s2[qq];
36         int flag=0;
37         for(int i=1;i<=m;++i){
38             scanf("%s%lf%s",s1,&c,s2);
39             if(strcmp(s1,s2)==0&&c>1.0){
40                 flag=1;
41                 break;
42             }
43             map[i].w=c;
44             for(int j=1;j<=n;++j)
45                 if(strcmp(country[j],s1)==0){
46                     map[i].s=j;
47                     break;
48                 }
49             for(int j=1;j<=n;++j)
50                 if(strcmp(country[j],s2)==0){
51                     map[i].e=j;
52                     break;
53                 }
54         }
55         printf("Case %d: ",k++);
56         if(flag){
57             printf("Yes\n");
58             continue;
59         }
60         if(bellman())    printf("Yes\n");
61         else            printf("No\n");
62     }
63     return 0;
64 }

 

posted @ 2016-05-04 16:09  我不萌、我要高冷  阅读(155)  评论(0编辑  收藏  举报