• poj 1806


    poj 1806
    题意:已知有n种货币,编号为1~n,以及它们之间的瑞换比例。现在Nick有第fir种货币meney元,问你Nick能不能通过这些货币的瑞换规则,使自己拿到更多的fir货币。

    思路:bellman_ford。判断有没有正环,有的话Nick就可以无限次使用这个正环使自己的货币增值。

     1 /**
     2  * @file   code.c
     3  * @author  <kong@KONG-PC>
     4  * @date   Sun Nov 04 21:54:40 2012
     5  *
     6  * @brief  求汇率转换问题
     7  *         采用Bellman_ford算法求是否存在正环,和求最短路径相反,这里
     8  *         要求最长路径,可以和典型的Bellman_ford一样,对每条边进行V-1
     9  *         次松弛,然后判断是否存在正环,如果存在则表明可以增加钱数。
    10  *         这里做了改进,当对每一条边进行V-1次松弛后,所得的钱数不一定
    11  *         满足要求,所以需要不断松弛,结束条件有两个
    12  *         1. 所有边都不能再松弛了,表明不存在正环,判断钱数是否满足条
    13  *         件,返回
    14  *         2. 经过不断的松弛,满足要求后,返回。
    15  */
    16 #include <stdio.h>
    17 #include <string.h>
    18 struct{
    19     int beg, end;
    20     double r, c;
    21 }edge[204];
    22 
    23 int money, m, t;
    24 double value;
    25 double dis[104];
    26 
    27 int bell_man()
    28 {
    29     memset(dis, 0, sizeof(dis));
    30     dis[t] = value;
    31     while(dis[t] <= value){
    32         int change=0;
    33         for(int i=0;i< 2 * m; i++){
    34             if(dis[edge[i].end] < (dis[edge[i].beg] - edge[i].c) * edge[i].r){
    35                 dis[edge[i].end] = (dis[edge[i].beg] - edge[i].c) * edge[i].r;
    36                 change=1;
    37             }
    38         }
    39         if(!change)
    40             return dis[t] > value;
    41     }
    42     return 1;
    43 }
    44 
    45 int main()
    46 {
    47     freopen("in", "r", stdin);
    48     int begin, end;
    49     double rn, cn, rern, recn;
    50     int p=0;
    51     while(scanf("%d%d%d%lf", &money, &m, &t, &value) != -1){
    52         for(int i=1;i<=m;i++){
    53             scanf("%d%d%lf%lf%lf%lf", &begin, &end, &rn, &cn, &rern, &recn);
    54             edge[p].beg=begin;
    55             edge[p].end=end;
    56             edge[p].r=rn;
    57             edge[p++].c=cn;
    58             edge[p].beg=end;
    59             edge[p].end=begin;
    60             edge[p].r=rern;
    61             edge[p++].c=recn;
    62         }
    63         if(!bell_man())
    64             printf("NO\n");
    65         else
    66             printf("YES\n");
    67     }
    68     return 0;
    69 }
  • 相关阅读:
    windows常用快捷键
    【Linux】查看系统位数
    【Centos】yum 安装mariaDB
    【Centos7 GRUB】修改开机等待时间
    Shell脚本编写规范
    【Shell Basic】source . 与 bash sh 的区别
    linux防火墙之 ufw
    【HotSpot】jps命令行详解
    【Ubuntu 16】网络配置文件
    【刷题】BZOJ 2179 FFT快速傅立叶
  • 原文地址:https://www.cnblogs.com/qianye/p/3055614.html
Copyright © 2020-2023  润新知