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 Vcur[MAXN],R[MAXN][MAXN];
bool vis[MAXN];
int cntNode[MAXN];
char ss[MAXN][100];

bool SPFA(int st)
{
    queue<int> que;
    int u,v;

    for(int i=1;i<=n;i++)
        Vcur[i]=0,vis[i]=0,cntNode[i]=0;
    Vcur[st]=1000.0;vis[st]=1;cntNode[st]=1;
    que.push(st);

    while(!que.empty())
    {
        u=que.front();que.pop();
        vis[u]=0;

        for(v=1;v<=n;v++)
        {
            if(Vcur[u]*R[u][v]>Vcur[v])
            {
                Vcur[v]=Vcur[u]*R[u][v];
                if(!vis[v])
                {
                    vis[v]=1;
                    ++cntNode[v];
                    que.push(v);
                    if(cntNode[v]>=n)
                        return true;
                }
            }
        }
    }
    return false;
}

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

int main()
{
    int Case=0;
    while(scanf("%d",&n)&&n)
    {
        memset(R,0,sizeof(R));
        Case++;
        for(int i=1;i<=n;i++)
            scanf("%s",ss[i]);
        scanf("%d",&m);
        while(m--)
        {
            char s1[100],s2[100];
            double rate;
            scanf("%s",s1);
            scanf("%lf",&rate);
            scanf("%s",s2);
            int u=Find(s1),v=Find(s2);
            R[u][v]=rate;
        }
        int k;
        for(k=1;k<=n;k++)
        {
            if(SPFA(k))
                break;
        }
        if(k>n) printf("Case %d: No\n",Case);
        else printf("Case %d: Yes\n",Case);
    }
    return 0;
}
时间: 2024-10-12 17:27:18

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。

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 判断正环)

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