zoukankan      html  css  js  c++  java
  • Arbitrage POJ 2240

    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
    ", t++);
            else printf("Case %d: No
    ", t++);
    
        }
    
    
        return 0;
    }
    View Code
  • 相关阅读:
    〖Linux〗-- 复制、用户和组操作、权限更改
    〖Linux〗-- 文本结构和基本命令
    〖Demo〗-- ATM
    〖Python〗-- 脚本目录规范
    二、配置文件
    一、SpringBoot入门
    File--字节流--字符流
    File--字节流--字符流
    SpringBoot快速搭建流程
    SpringBoot快速搭建流程
  • 原文地址:https://www.cnblogs.com/daydayupacm/p/5704375.html
Copyright © 2011-2022 走看看