(简单) 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 French francs, and 1 French franc buys 0.21 US dollar. Then, by converting currencies, a clever trader can start with 1 US dollar and buy 0.5 * 10.0 * 0.21 = 1.05 US dollars, making a profit of 5 percent.

  Your job is to write a program that takes a list of
currency exchange rates as input and then determines whether arbitrage
is possible or not.

  题目就是问货币能不能通过转换而让自己增加。。。

  用的SPFA来判断的环。。。枚举每一个点进行SPFA (也就是说floyd也是可以的。。。)。。。

代码如下:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>

using namespace std;

const int INF=10e8;
const int MaxN=40;

struct Edge
{
    int v;
    double cost;

    Edge(int _v=0,double _cost=0):v(_v),cost(_cost) {}
};

vector <Edge> E[MaxN];
bool vis[MaxN];
int couNode[MaxN];

bool SPFA(double lowcost[],int n,int start)
{
    queue <int> que;
    int u,v;
    double c;
    int len;

    for(int i=1;i<=n;++i)
    {
        vis[i]=0;
        couNode[i]=0;
        lowcost[i]=0;
    }

    vis[start]=1;
    couNode[start]=1;
    lowcost[start]=1;

    que.push(start);

    while(!que.empty())
    {
        u=que.front();
        que.pop();

        vis[u]=0;
        len=E[u].size();

        for(int i=0;i<len;++i)
        {
            v=E[u][i].v;
            c=E[u][i].cost;

            if(lowcost[u]*c>lowcost[v])
            {
                lowcost[v]=lowcost[u]*c;

                if(!vis[v])
                {
                    vis[v]=1;
                    ++couNode[v];
                    que.push(v);

                    if(couNode[v]>=n)
                        return 0;
                }
            }
        }
    }

    return 1;
}

inline void addEdge(int u,int v,double c)
{
    E[u].push_back(Edge(v,c));
}

char ss[40][100];
double ans[MaxN];
int N;

int find(char *s)
{
    for(int i=1;i<=N;++i)
        if(strcmp(s,ss[i])==0)
            return i;
}

int main()
{
    int M;
    bool ok;
    char ts1[100],ts2[100];
    int t1,t2;
    double tr;
    int cas=1;

    for(scanf("%d",&N);N;scanf("%d",&N),++cas)
    {
        for(int i=1;i<=N;++i)
        {
            scanf("%s",ss[i]);

            E[i].clear();
        }

        scanf("%d",&M);

        for(int i=1;i<=M;++i)
        {
            scanf("%s %lf %s",ts1,&tr,ts2);
            t1=find(ts1);
            t2=find(ts2);

            addEdge(t1,t2,tr);
        }

        ok=0;

        for(int i=1;i<=N;++i)
            if(!SPFA(ans,N,i))
            {
                ok=1;
                break;
            }

        printf("Case %d: ",cas);

        if(ok)
            printf("Yes\n");
        else
            printf("No\n");

    }

    return 0;
}

时间: 2024-10-12 09:20:57

(简单) POJ 2240 Arbitrage,SPFA。的相关文章

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

[ 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<

POJ 2240 Arbitrage

Bellman 求最大环. 询问货币是否纯在套汇. 假如给你 1 元,通过兑换之后 超过 1 元就是存在套汇了. 用 map 映射比较方便. #include<cstdio> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<queue> #include<map> #include<iostream>

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(SPFA+邻接矩阵)

( ̄▽ ̄)" #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<string> #include<vector> #include<queue> using namespace std; const int MAXN=40; int n,m; double

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(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