• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
qianye0905
博客园    首页    新随笔    联系   管理    订阅  订阅
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 }

 

posted on 2013-05-02 22:50  qianye0905  阅读(224)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3