POJ

题目链接:http://poj.org/problem?id=2240

 
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

题意: 问你能不能找到一个圈,使沿着这个圈兑换钱币后钱数增加。

路径为汇率,由于自环汇率是1,因此,我们要找一个圈作用的结果大于1。因为题目给得很清楚,是边边相乘,于是就是路径松弛的时候改成相乘就可以了。

分析:最短路flody。依旧是字符串转换需要注意,然后汇率相乘的,如果自身到自身大于1了,就说明Yes,否则,No。

 
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stack>
 6 #include<math.h>
 7 #include<queue>
 8 #include<map>
 9 using namespace std;
10 
11 ///map可以理解为一个一对一的key,value对,也叫做键值对
12 ///通常用于快速寻找一个key的对应的value是多少
13 ///map<key,value>mymap; mymap[key]=value;
14 
15 #define INF 0x3f3f3f3f
16 #define N 1200
17 
18 double maps[N][N];
19 int n;
20 
21 void Init()
22 {
23     for(int i=0;i<n;i++)
24         for(int j=0;j<n;j++)
25         if(i==j)
26         maps[i][j]=1;
27         else
28         maps[i][j]=-INF;
29 }
30 
31 void flody()
32 {
33     int i,j,k;
34     for(k=0;k<n;k++)
35         for(i=0;i<n;i++)
36         for(j=0;j<n;j++)
37         if(maps[i][j]<maps[i][k]*maps[k][j])
38         maps[i][j]=maps[i][k]*maps[k][j];
39 }
40 
41 int main()
42 {
43     int t=1,i,m,kk;
44     double l;
45     map<string,int> mp;
46     char s[N],str[N];
47 
48     while(scanf("%d", &n), n)
49     {
50         kk=0;
51         Init();
52         for(i=0;i<n;i++)
53         {
54             scanf("%s", s);
55             mp[s]=kk;
56             kk++;
57         }
58 
59         scanf("%d", &m);
60 
61         for(i=0;i<m;i++)
62         {
63             scanf("%s%lf%s", s,&l,str);
64             maps[mp[s]][mp[str]]=l;
65         }
66 
67         flody();
68         int f=0;
69         for(i=0;i<n;i++)
70             if(maps[i][i]>1)
71             f=1;
72 
73         if(f==1)
74             printf("Case %d: Yes
",t++);
75         else
76             printf("Case %d: No
",t++);
77     }
78     return 0;
79 }

另外附上一个没有使用map函数的代码,字符串的处理部分可以借鉴学习。

 1 #include<iostream>
 2 #include<string.h>
 3 #include<cmath>
 4 using namespace std;
 5 
 6 int n,m,l=0;
 7 
 8 char a[40][50];
 9 
10 int loc(char t[])
11 {
12     int i;
13     for(i=1;i<=n;i++)
14     {
15         if(strcmp(t,a[i])==0)
16         {
17             return i;
18         }
19     }
20     return -1;
21 }
22 
23 void floyd(double b[][50])
24 {
25     int i,j,k;
26     for(i=1;i<=n;i++)
27     {
28         for(j=1;j<=n;j++)
29         {
30             for(k=1;k<=n;k++)
31             {
32                 if(b[j][k]<b[j][i]+b[i][k])
33                 {
34                     if(j==k&&pow(10,b[j][k])>1)
35                     {
36                         cout<<"Case "<<l<<": Yes"<<endl;
37                         return;
38                     }
39                     b[j][k]=b[j][i]+b[i][k];
40                 }
41             }
42         }
43     }
44     cout<<"Case "<<l<<": No"<<endl;
45 }
46 
47 int main()
48 {
49     int i,j;
50     char c[50],d[50];
51     double w;
52     while(cin>>n,n!=0)
53     {
54         double b[50][50]={0};
55         l++;
56         for(i=1;i<=n;i++)
57         {
58             cin>>a[i];
59         }
60         cin>>m;
61         for(i=1;i<=m;i++)
62         {
63             cin>>c>>w>>d;
64             b[loc(c)][loc(d)]=log10(w);
65         }
66 //         for(i=1;i<=n;i++)
67 //         {
68 //             for(j=1;j<=n;j++)
69 //             {
70 //                 cout<<b[i][j]<<" ";
71 //             }
72 //             cout<<endl;
73 //         }
74         floyd(b);
75     }
76     return 0;
77 } 
原文地址:https://www.cnblogs.com/weiyuan/p/5726822.html