POJ 2240 Arbitrage

Bellman 求最大环。

询问货币是否纯在套汇。

假如给你 1 元,通过兑换之后 超过 1 元就是存在套汇了。

用 map 映射比较方便。

#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<queue>
#include<map>
#include<iostream>
#define INF 0x7fffffff
using namespace std;
struct lx
{
    int u,v;
    double r;
};
int n,m;
map<string,int>str;
vector<lx>g;
double d[31];

bool Bellman(int start)
{
    memset(d,0,sizeof(d));
    d[start]=1.0;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<g.size();j++)
        {
            int u=g[j].u;
            int v=g[j].v;
            double r=g[j].r;
            d[v]=max(d[v],d[u]*r);
        }
    }
    if(d[start]>1.0)return 1;
    return 0;
}

int main()
{
    int cot=1;
    while(scanf("%d",&n),n)
    {
        str.clear();
        g.clear();
        string s,s1,s2;
        for(int i=1;i<=n;i++)
        {
            cin>>s;
            str[s]=i;
        }
        cin>>m;
        double r;
        for(int i=0;i<m;i++)
        {
            cin>>s1>>r>>s2;
            lx now;
            now.u=str[s1];
            now.v=str[s2];
            now.r=r;
            g.push_back(now);
        }
        bool flag=0;
        for(int i=1;i<=n;i++)
            if(Bellman(i)){flag=1;break;}
            cout<<"Case "<<cot++<<": ";
        if(flag)puts("Yes");
        else puts("No");
    }
}

POJ 2240 Arbitrage,布布扣,bubuko.com

时间: 2024-10-10 07:55:00

POJ 2240 Arbitrage的相关文章

poj 2240 Arbitrage 题解

Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 21300   Accepted: 9079 Description Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currenc

POJ 2240 -- Arbitrage(Bellman-Ford)

POJ 2240 -- Arbitrage(Bellman-Ford) 题意: 已知n种货币,以及m种货币汇率及方式,问能否通过货币转换,使得财富增加. Bellman-ford 算法: 一个具有n个顶点的图如果不存在环,则从顶点x,到顶点y,最多经过n-1条边(要考虑连通性,每个顶点最多经过 1 次),因此 x 到 y 的最短路 最多经过 n - 1 次松弛操作(就是更新长度)就应该出现,如果第 n 次松弛还可以得到最优,那么这个图就肯定是存在环了(直接用Dijkstra 就无法得到最优的,环

poj 2240 Arbitrage (Floyd)

链接:poj 2240 题意:首先给出N中货币,然后给出了这N种货币之间的兑换的兑换率. 如 USDollar 0.5 BritishPound 表示 :1 USDollar兑换成0.5 BritishPound. 问在这N种货币中是否存在货币经过若干次兑换后,兑换成原来的货币能够使货币量添加. 思路:本题事实上是Floyd的变形.将变换率作为构成图的路径的权值.只是构成的图是一个有向图. 最后将松弛操作变换为:if(dis[i][j]<dis[i][k]*dis[k][j]). #includ

poj 2240 Arbitrage(bellman-ford 判断正环)

http://poj.org/problem?id=2240 基本和poj 1860相同 只是把单点变成了任意点 做完1860再做这题就完全把思路套上就过了 做完才发现网上的题解都用的是floyd 不过整体思路都是大同小异吧 不过在效率上好像就低下了太多= = #include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<stack> #include<

POJ 2240 Arbitrage (spfa判环)

Arbitrage Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currency. For example, suppose that 1 US Dollar buys 0.5 British pound, 1 British pound buys 10.0 Frenc

(简单) POJ 2240 Arbitrage,SPFA。

Description Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currency. For example, suppose that 1 US Dollar buys 0.5 British pound, 1 British pound buys 10.0 Fre

poj 2240 Arbitrage(Bellman-Ford算法学习)

Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15806   Accepted: 6648 Description Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currenc

POJ 2240 Arbitrage(最短路 套汇)

题意  给你n种币种之间的汇率关系  判断能否形成套汇现象  即某币种多次换为其它币种再换回来结果比原来多 基础的最短路  只是加号换为了乘号 #include<cstdio> #include<cstring> #include<string> #include<map> using namespace std; map<string, int> na; const int N = 31; double d[N], rate[N][N], r;

[ An Ac a Day ^_^ ][kuangbin带你飞]专题四 最短路练习 POJ 2240 Arbitrage spfa求负环

题意就是问倒腾外币能不能升值 不用spfa 用其他的最短路算法也可以 松弛条件换成dist[v]<dist[u]*e[u][i].value 当然 貌似只有spfa有这个坑…… 有A  (value>1.0) A 这种情况……我的天 用Dij Floyd都只用判断如果松弛到了自己 那么一定有环 直接跳出就行 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<