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