poj 2240 Floyd判断有向图负环(arbitrage)

本文介绍了一种使用Floyd算法检测套汇可能性的方法。通过构建有向图并利用对数转换,寻找是否存在权重乘积大于1的环路,即存在套利机会。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:Arbitrage问题(套汇)。给定若干币种及一些币种转换的汇率,问能否有套汇的可能。

思路:如果以币种为定点,汇率为边建图,则相当于求一个圈,其上权值乘积大于1。将权值取对数再取负,变成求有向图负环。用floyd算法即可。(直接上Floyd,三层循环中判断直接用乘法也OK)。另外用spfa判断应该也行,只需将每个点都入队一次。

#include <stdio.h>
#include <string.h>
#include <math.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define N 35
char name[N][128];
int c=1,n,m;
double g[N][N];
int find(char* x){
    int i;
    for(i = 1;i<=n;i++)
        if(!strcmp(name[i], x))
            return i;
    return -1;
}
int main(){
    while(scanf("%d",&n) && n){
        int i,j,k,a,b;
        char s[128],t[128];
        double w;
        for(i = 1;i<=n;i++)
            for(j = 1;j<=n;j++)
                g[i][j] = 0x3fffffff;
        for(i = 1;i<=n;i++)
            scanf("%s",name[i]);
        scanf("%d",&m);
        for(i = 0;i<m;i++){
            scanf("%s %lf %s",s,&w,t);
            a = find(s);
            b = find(t);
            g[a][b] = -log10(w);
        }
        for(k = 1;k<=n;k++)
            for(i = 1;i<=n;i++)
                for(j = 1;j<=n;j++)
                    g[i][j] = min(g[i][j],g[i][k]+g[k][j]);
        for(i = 1;i<=n;i++)
            if(g[i][i] < 0)
                break;
        if(i<=n)
            printf("Case %d: Yes\n",c++);
        else
            printf("Case %d: No\n",c++);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值