题目链接:Arbitrage
Floyd算法就是如果i点到k点之间有通路,k点到j点有通路,
且两条通路的长度和小于i点到j点的长度,那就将i点到j距离就是经过k点的长度
对于这个套利的题,就可以用Floyd算法
看是否可以找出一个相乘大于1的路径,因为要想干这件坏事必须保证换一拨钱后钱会变多
还有需要注意的是对map的使用,因为题上给的是字符串,所以我们需要使用map完成一个字符串到数字的一个映射,然后对数字进行操作即可
AC代码:
#include<iostream>
#include<map>
using namespace std;
int n,rr;
const int N=35;
double mp[N][N],p;
map<string,int>m;
void Init(){
for(int i=0;i<=n;i++){
for(int j=0;j<=n;j++){
mp[i][j]=mp[j][i]=0;
}
}
}
bool floyd(){
for(int k=0;k<=n;k++){
for(int i=0;i<=n;i++){
for(int j=0;j<=n;j++){
if(mp[i][j]<mp[i][k]*mp[k][j]){
mp[i][j]=mp[i][k]*mp[k][j];
}
}
}
}
bool flag=false;
for(int i=1;i<=n;i++){
if(mp[i][i]>1){
flag=true;
break;
}
}
return flag;
}
int main(){
char ch1[35],ch2[35];
int count=1;
while(cin>>n){
if(n==0){
break;
}
Init();
m.clear();
for(int i=1;i<=n;i++){
cin>>ch1;
m[ch1]=i;
}
cin>>rr;
for(int i=0;i<rr;i++){
scanf("%s %lf %s",ch1,&p,ch2);
int a=m[ch1],b=m[ch2];
mp[a][b]=p;
}
cout<<"Case "<<count<<':';
count++;
if(floyd()){
cout<<" Yes"<<endl;
}else{
cout<<" No"<<endl;
}
}
return 0;
}