POJ 2240 Arbitrage (Floyd最短路变形)

来源:互联网 发布:怎么修改数据库时间 编辑:程序博客网 时间:2024/05/16 18:32

题意: 求是否有一种货币经过交易后可以升值 ;   例如1美元换取0.5英镑, 1英镑换取10法币, 1法币换取0.21美元     通过交易, 1美元可以升值为   0.5*10*0.21 = 1.05美元

分析:   题目要求只要有一种货币满足条件即可,所以可用Floyd算法进行处理, 得到任意两种货币间, 最大的交易收益.

Code:

#include<iostream>#include<cstring>#include<cmath>#include<cstdio>#include<algorithm>#include<string>using namespace std;const int maxn = 50;int n, m;char Dtype[maxn][maxn];double dis[maxn][maxn];int getStrId(char c[]){int i;for(i=1; i<=n; i++){if(!strcmp(Dtype[i], c)){return i;}}return 0;}char s[maxn*5], e[maxn*5];double x;string ans;void floyd(){int i, j, k ;for(k=1; k<=n; k++){for(i=1; i<=n; i++){for(j=1; j<=n; j++){if(dis[i][j] < dis[i][k]*dis[k][j]){dis[i][j] = dis[i][k]*dis[k][j];}}}}for(i=1; i<=n; i++){if(dis[i][i] > 1.0){ans = "Yes";return ;}}ans = "No";return ; }int main(){int cas = 0, i, j, k;//freopen("in.txt", "r", stdin);while(scanf("%d", &n), n){for(i=1; i<=n; i++){for(j=1; j<=n; j++){dis[i][j]=1;}}ans="";for(i=1; i<=n; i++) scanf("%s", Dtype[i]);//for(i=1; i<=n; i++) printf("%s\n", Dtype[i]);scanf("%d", &m);//建图int p, q;for(i=1; i<=m; i++){scanf("%s", s);p = getStrId(s);scanf("%lf", &x);scanf("%s", e);q = getStrId(e);dis[p][q] = x;}floyd();printf("Case %d: ", ++cas);cout << ans <<endl;}return 0;}



0 0
原创粉丝点击