POJ - 2240 Arbitrage(Floyd变型)
题意:有n种类型的货币求是否存在经过兑换能增值。
#include<iostream>
#include<cstring>
#include<map>
using namespace std;
const int N = 110;
double g[N][N];
map<string,int> Si;
int main()
{
int T=1;while(T){
int n;cin>>n;if(!n) break;for(int i=1;i<=n;i++){
string str;cin>>str;Si[str]=i;}memset(g,0,sizeof g);for(int i=0;i<=n;i++) g[i][i]=1;int m;cin>>m;for(int i=1;i<=m;i++){
string a,b;double c;cin>>a>>c>>b;g[Si[a]][Si[b]]=c;}for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(g[i][j]<g[i][k]*g[k][j])g[i][j]=g[i][k]*g[k][j];bool ok=true;for(int i=1;i<=n;i++)if(g[i][i]>1){
cout<<"Case "<<T++<<": Yes"<<endl;ok=false;break;}if(ok) cout<<"Case "<<T++<<": No"<<endl;}return 0;
}