zoukankan      html  css  js  c++  java
  • poj 1860 Currency Exchange 解题报告

    题目链接:http://poj.org/problem?id=1860

    题目意思:给出 N 种 currency, M种兑换方式,Nick 拥有的的currency 编号S 以及他的具体的currency(V)。M 种兑换方式中每种用6个数描述: A, B, Rab, Cab, Rba, Cba。其中,Rab: 货币A 兑换 货币B 的汇率为Rab,佣金为Cab。Rba:货币B 兑换 货币 A 的汇率,佣金为Cba。假设含有的A货币是x,那么如果兑换成B,得到的货币B 就是:(x-Cab) * Rab。问从 货币S 经过一定次数的兑换,最终回归到货币S,能否使得 Nick 本来含有的 S 大。

           思路我是借鉴这个人的:

           http://blog.csdn.net/lyhvoyage/article/details/19281013

           可以说,是用了Bellman_ford 的 逆向思维。传统的Bellman_ford 是用来求可以含有负边权的最短路径,且判断是否有负权回路。

           这个题目希望我们验证是否存在正权回路:顶点的权值能不断增加,且能无限一直松弛下去。

           不过初始化与传统的Bellman_ford 是不同的, dist[S] = V,其他dist[i] = 0 / 无穷小。当 S 到其他点的 距离能不断增大时,说明存在正权回路。

           

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 
     6 const int maxn = 1e4 + 10;
     7 const int maxv = 100 + 5;
     8 
     9 double has, dist[maxv];
    10 int cnt, type;
    11 int N, M;
    12 
    13 struct node
    14 {
    15     int a, b;
    16     double rate, commission;
    17 }currency[maxn];
    18 
    19 bool Bellman_ford()
    20 {
    21     for (int i = 1; i <= N; i++)
    22         dist[i] = (i == type ? has : 0);
    23     for (int i = 1; i < N; i++)
    24     {
    25         bool flag = false;
    26         for (int j = 1; j < cnt; j++)
    27         {
    28             double t = (dist[currency[j].a] - currency[j].commission) * currency[j].rate;
    29             if (t > dist[currency[j].b])
    30             {
    31                 dist[currency[j].b] = (dist[currency[j].a] - currency[j].commission) * currency[j].rate;
    32                 flag = true;
    33             }
    34         }
    35         if (!flag)
    36             break;
    37     }
    38     for (int j = 1; j < cnt; j++)
    39     {
    40         double t = (dist[currency[j].a] - currency[j].commission) * currency[j].rate;
    41         if (t > dist[currency[j].b])
    42             return true;
    43     }
    44     return false;
    45 }
    46 
    47 int main()
    48 {
    49     while (scanf("%d%d%d%lf", &N, &M, &type, &has) != EOF)
    50     {
    51         int A, B;
    52         double Rab, Cab, Rba, Cba;
    53         cnt = 1;
    54         while (M--)
    55         {
    56             scanf("%d%d%lf%lf%lf%lf", &A, &B, &Rab, &Cab, &Rba, &Cba);
    57             currency[cnt].a = A;
    58             currency[cnt].b = B;
    59             currency[cnt].rate = Rab;
    60             currency[cnt].commission = Cab;
    61 
    62             currency[++cnt].a = B;
    63             currency[cnt].b = A;
    64             currency[cnt].rate = Rba;
    65             currency[cnt++].commission = Cba;
    66         }
    67         printf("%s
    ", Bellman_ford() ? "YES" : "NO");
    68     }
    69     return 0;
    70 }
  • 相关阅读:
    [HNOI2007]最小矩形覆盖
    [HAOI2008]下落的圆盘
    JSON相关 JSON在线解析 JSON压缩转义工具 JSON着色工具 JSON 在线格式化工具 在线XML/JSON互相转换工具 XML、JSON在线转换
    速度竟差9倍!6款32GB USB3.0优盘横评
    Linux 中用 dd 命令来测试硬盘读写速度
    CrystalDiskMark v7.0.0h中文版
    个人觉得,不单是教育缺失的问题,贫穷才是真像。贫穷分
    就算是3.0的U盘,写入速度10M及以下也是正常的,U盘用很差的闪存颗粒的话就算10Gbps的USB3.1也是很慢的。
    USB历代标准及接口发展
    测试 USB 存储设备读写性能(Mb/s),平均读写速度等
  • 原文地址:https://www.cnblogs.com/windysai/p/3913605.html
Copyright © 2011-2022 走看看