码迷,mamicode.com
首页 > 其他好文 > 详细

Arbitrage POJ 2240

时间:2016-07-25 18:18:05      阅读:559      评论:0      收藏:0      [点我收藏+]

标签:

http://poj.org/problem?id=2240

 

题意:现你有N种货币,在进行货币进行兑换后,最终仍需兑换成原本货币,若其中某一种货币增加了,就输出“Yes”,否则输出“No”.

 

一开始TLE了, 因为 return 1 的位置放错了。。 一开始没咋想,直接放到最后判断了。。。

 

 

技术分享
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <map>
#include <queue>
using namespace std;

#define maxn 150
#define INF 0x3f3f3f3f
int head[maxn], v[maxn];
double dist[maxn];
int cnt;

struct node
{
    int u, v, next;
    double w;
} maps[maxn];

void Add(int u, int v, double w)
{
    maps[cnt].v = v;
    maps[cnt].w = w;
    maps[cnt].next = head[u];
    head[u] = cnt ++;
}

int spfa(int s)
{
    memset(v, 0, sizeof(v));
    queue<int>Q;
    Q.push(s);
    v[s] = 1;

    while(Q.size())
    {
        int p=Q.front();
        Q.pop();
        v[p] = 0;

        for(int i=head[p]; i!=-1; i=maps[i].next)
        {
            int q = maps[i].v;

            double t = dist[p]*maps[i].w;

            if(dist[q]<t)
            {
                dist[q] = t;
                if(!v[q])
                {
                    v[q] = 1;
                    Q.push(q);
                }
            }
        }

        if(dist[s] > 1)
        return 1;

    }

    return 0;
}

int main()
{
    int n, m, t=1;
    char str[50];

    while(scanf("%d", &n), n)
    {
        map<string, int>s;
        s.clear();

        for(int i=1; i<=n; i++)
        {
            scanf("%s", str);
            s[str] = i;
        }

        scanf("%d", &m);

        char a[50], b[50];
        double c;
        cnt = 0;
        memset(head, -1, sizeof(head));

        for(int i=1; i<=m; i++)
        {
            scanf("%s %lf %s", a, &c, b);
            Add(s[a], s[b], c);
        }

        int ans = 0;
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
                dist[j] = - INF;
            dist[i] = 1;
            ans += spfa(i);
            if(ans)
                break;
        }

        if(ans)  printf("Case %d: Yes\n", t++);
        else printf("Case %d: No\n", t++);

    }


    return 0;
}
View Code

 

Arbitrage POJ 2240

标签:

原文地址:http://www.cnblogs.com/daydayupacm/p/5704375.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!