Arbitrage
题意:货币兑换,换取最大钱币;
解析:构图,spfa
#include<iostream> #include<cstring> #include<queue> #include<map> #include<cstdio> using namespace std; const int maxn = 1005; double cost[ maxn ][ maxn ], dis[ maxn ]; int vis[ maxn ]; int n, m; char ch[ maxn ], str1[ maxn ], str2[ maxn ]; map<string,int> str; int spfa( int start ){ for( int i = 1; i <= n; ++i ){ dis[ i ] = vis[ i ] = 0; } vis[ start ] = 1; dis[ start ] = 1.0; queue< int > Q; while( !Q.empty() ){ Q.pop(); } Q.push( start ); while( !Q.empty() ){ int p = Q.front(); Q.pop(); vis[ p ] = 0; for( int i = 1; i <= n; ++i ){ if( dis[ p ] * cost[ p ][ i ] > dis[ i ] ){ dis[ i ] = dis[ p ] * cost[ p ][ i ]; if( dis[ start ] > 1.0 ){ return 1; } if( !vis[ i ] ){ vis[ i ] = 1; Q.push( i ); } } } } return 0; } int main(){ int Case = 1; while( scanf( "%d", &n ) != EOF ){ if( !n ) break; str.clear(); for( int i = 1; i <= n; ++i ){ for( int j = 1; j <= n; ++j ){ if( i == j ) cost[ i ][ j ] = 1.0; else cost[ i ][ j ] = 0; } } for( int i = 1; i <= n; ++i ){ scanf( "%s", ch ); str[ ch ] = i; } scanf( "%d", &m ); double num; for( int i = 1; i <= m; ++i ){ scanf( "%s%lf%s", str1, &num, str2 ); cost[ str[ str1 ] ][ str[ str2 ] ] = num; } int flag = 0; for( int i = 1;i <= n; ++i ){ if( spfa( i ) ){ flag = 1; break; } } printf( "Case %d: ", Case++ ); if( flag ){ puts( "Yes" ); } else{ puts( "No" ); } } return 0; }