Bellman_Ford poj 1860

原创 2012年03月22日 13:58:18

题意:求根据各种货币之间的汇率能否使某种货币升值。货币a兑换成b所得值是 (a-c[a][b])*r[a][b]。

 

思路:令dist[a]表示从s(最初所持货币)出发经过各种已知的汇率兑换成a所能得到的最大值。那么便可以发现一个明显的放缩条件:(dist[a]-c[a][b])*r[a][b]>dist[b]。如此便可以用bellman水了。另外需要注意的是不仅是存在正权回路的时候需要输出YES,当图中不存在正权回路,但通过求最长路后dist[s]>v时同样需要输出YES

/*
Sample Input

3 2 1 20.0
1 2 1.00 1.00 1.00 1.00
2 3 1.10 1.00 1.10 1.00
Sample Output

YES

*/

#include<cstdio>
#include<cstring>

#define MAXVN 120
#define MAXEN 2200
#define INF 100000000

using namespace std;

typedef struct{
    int u, v;
    double value, c;
}Edge;
Edge eg[MAXEN];
double dis[MAXVN];

int vn, en;

int Bellman_Ford(int st, double v){
    for(int i = 1; i <= vn; i++){
        dis[i] = 0;
    }
    //printf("eg1v:%d\v", eg[1].v);
    dis[st] = v;
    bool realxed = 0;
    for(int i = 1; i <= vn - 1; i++){
        for(int j = 1; j <= en; j++){

           if(dis[eg[j].v] < (dis[eg[j].u] - eg[j].c)*eg[j].value){
                dis[eg[j].v] = (dis[eg[j].u] - eg[j].c)*eg[j].value;
                realxed = 1;
            }
            //printf("dfsf");
        }
        if(!realxed)  break;
    }

    for(int j = 1; j <= en; j++){
        if(dis[eg[j].v] < (dis[eg[j].u] - eg[j].c)*eg[j].value) return 1;
    }
    return 0;
}

int main(){
    int n, m, s,a, b;
    double v, rab, cab,rba, cba;
    while(scanf("%d%d%d%lf", &n, &m, &s, &v) != EOF){
        vn = n;en = 2*m;
        int count = 1;
        //printf("n:%d m:%d s:%d v:%lf\n", n, m, s, v);
        while(m--){
            scanf("%d%d%lf%lf%lf%lf",&a, &b, &rab, &cab, &rba, &cba);
            //printf("eg1v:%d\n", b);
            eg[count].u = a;
            eg[count].v = b;
            eg[count].value = rab;
            eg[count++].c = cab;
            eg[count].u = b;
            eg[count].v = a;
            eg[count].value = rba;
            eg[count++].c = cba;
        }
        if(Bellman_Ford(s,v) == 1) printf("YES\n");
        else printf("NO\n");
    }
}


poj1860 Currency Exchange floyd判断正环 (手动翻译)

我们的城市有几个货币兑换点。让我们假设每一个点都只能兑换专门的两种货币。可以有几个点,专门从事相同货币兑换。每个点都有自己的汇率,外汇汇率的A到B是B的数量你1A。同时各交换点有一些佣金,你要为你的交...
  • yslcl12345
  • yslcl12345
  • 2016年01月24日 16:13
  • 1248

POJ 1860 bellman_ford算法

一道最短路的题,建图有点难度,想了一个多小时的建图,然后再用bellman_ford就可以轻松水过了。。。。。。。。题目: Currency Exchange Time L...
  • wmn_wmn
  • wmn_wmn
  • 2012年03月14日 13:55
  • 635

POJ 1860 bellman_ford

#include #include #include using namespace std; //#define DEBUG struct exchgpnt { int a; int b;...
  • ych_ding
  • ych_ding
  • 2013年10月05日 22:09
  • 448

poj 1860 Bellman_ford

总结bellman_ford算法: 主要考虑到带负权边的图,这样的图,对于存在负权边时无法用dfs,prim等求最短路的。因为每次更新不能确定是否有正值与负值相加得出错误的最短路径的点。 bell...
  • amourjun
  • amourjun
  • 2012年12月15日 21:29
  • 465

POJ 1860 Bellman_Ford

Currency Exchange Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 21092 Accepted: 7554 ...
  • Yuanchang_Best
  • Yuanchang_Best
  • 2015年01月25日 18:42
  • 280

POJ-1860(最短路)

Several currency exchange points are working in our city. Let us suppose that each point specializes...
  • Swust_Zeng_zhuo_K
  • Swust_Zeng_zhuo_K
  • 2017年07月18日 15:38
  • 271

【Bellman_Ford】poj 1860 Currency Exchange

http://poj.org/problem?id=1860 题意:A和B交换率相等(双向图),每次交换需要小费(可以交换多次),问经过一系列交换后(最后需要换回最开始的那种货币),资金能否增长...
  • yduqytd
  • yduqytd
  • 2014年03月27日 19:29
  • 383

POJ 1860 Currency Exchange [bellman_ford]

传送门:http://poj.org/problem?id=1860 题目: Currency Exchange Time Limit:1000MS   Me...
  • u013986860
  • u013986860
  • 2015年02月10日 22:45
  • 391

poj 1860 Currency Exchange (Bellman_Ford)

点击打开链接 第一次写Bellman_Ford.. #include"stdio.h" int n,m,start; double money,rab,rba,cba,cab; struc...
  • yyf573462811
  • yyf573462811
  • 2012年07月31日 19:40
  • 496

【POJ 1860】Currency Exchange(Bellman_Ford)

DescriptionSeveral currency exchange points are working in our city. Let us suppose that each point ...
  • iceiceicpc
  • iceiceicpc
  • 2016年08月18日 15:09
  • 211
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Bellman_Ford poj 1860
举报原因:
原因补充:

(最多只允许输入30个字)