首页 > 其他 > 详细

Arbitrage POJ 2240

时间:2016-07-25 18:17:24      阅读:547      评论: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
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!