【POJ 2240】 Arbitrage

【POJ 2240】Arbitrage

给出n种货币和m种汇率 问经过几次交易后能不能增值 Bellman或者SPFA判断正环即可

主要想吐槽POJ的编译器……G++1A cin用了750ms 险过。。还是关了同步的状态下,。 不用cin也跑了235ms,。。后来用C++ CE……然后测了几次发现是mapCE了……总之试了好多次发现少了string头文件,。cstring头文件在c++编译器下可能少些方法 总之…………写全头文件很重要
【POJ 2240】 Arbitrage_第1张图片

上代码

#include

using namespace std;

typedef struct Edge
{
    int v,next;
    double w;
}Edge;

Edge eg[999];
int head[33],in[33];
double dis[33];
bool vis[33];
map <string,int> mp;
int n,m;

bool SPFA()
{
    int u,v,i;
    double w;
    memset(vis,0,sizeof(vis));
    memset(in,0,sizeof(in));
    for(i = 1; i <= n; ++i)
        dis[i] = 0;
    dis[1] = 1;
    queue <int> q;
    q.push(1);

    while(!q.empty())
    {
        u = q.front();
        q.pop();
        vis[u] = 0;
        for(i = head[u]; i != -1; i = eg[i].next)
        {
            v = eg[i].v;
            w = eg[i].w;
            if(dis[v] < dis[u]*w)
            {
                dis[v] = dis[u]*w;
                if(!vis[v])
                {
                    in[v]++;
                    if(in[v] == n) return 1;
                    q.push(v);
                    vis[v] = 1;
                }
            }
        }
    }
    return 0;
}

int main()
{
    char to[666],from[666];
    int i,z = 0;

    while(~scanf("%d",&n) && n)
    {
        memset(head,-1,sizeof(head));
        for(i = 1; i <= n; ++i)
        {
            scanf("%s",to);
            mp[to] = i;
        }
        scanf("%d",&m);
        for(i = 0; i < m; ++i)
        {
            scanf("%s %lf %s",from,&eg[i].w,to);
            eg[i].v = mp[to];
            eg[i].next = head[mp[from]];
            head[mp[from]] = i;
        }

        printf("Case %d: %s\n",++z,SPFA()? "Yes": "No");
    }
    return 0;
}

你可能感兴趣的:(最短路,SPFA,正环)