题目大意:给出不同的货币,然后是一种对另一种的兑换比率,若从一种货币,经过若干次兑换又换回本身,原来是1元,回来时比一元多,就输出Yes 否则输出No
解决:floyd算法
#include <iostream> #include <string> using namespace std; const int N=35; double cost[N][N]; int n; void init() { for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(i==j)cost[i][j]=1.0; else cost[i][j]=0.0; } void floyd() { int i,j,k; for( k=0;k<n;k++) for( i=0;i<n;i++) for( j=0;j<n;j++) if(cost[i][j]<cost[i][k]*cost[k][j]) cost[i][j]=cost[i][k]*cost[k][j]; for( i=0;i<n;i++) if(cost[i][i]>1){cout<<"Yes"<<endl;return;} if(i==n)cout<<"No"<<endl; } int main() { int m,i,icase=1; string a,b; double r; while(cin>>n,n) { init(); string kind[N]; for(i=0;i<n;i++) cin>>kind[i]; cin>>m; while(m--) { cin>>a>>r>>b; int beg=-1,end=-1; for(i=0;i<n && beg==-1 || end==-1;i++) { if(kind[i]==a)beg=i; if(kind[i]==b)end=i; } cost[beg][end]=r; } cout<<"Case "<<icase++<<": "; floyd(); } system("pause"); return 0; }
本算法与初始化的时候有很大关系若用一下方法初始化应为
void init() { for(int i=0;i<n;i++) for(int j=0;j<n;j++) cost[i][j]=-1; } void floyd() { int i,j,k; for( k=0;k<n;k++) for( i=0;i<n;i++) for( j=0;j<n;j++) //必须判断边存在与否
if(cost[i][k]!=-1 && cost[k][j]!=-1 && cost[i][j]<cost[i][k]*cost[k][j]) cost[i][j]=cost[i][k]*cost[k][j]; for( i=0;i<n;i++) if(cost[i][i]>1){cout<<"Yes"<<endl;return;} if(i==n)cout<<"No"<<endl; }