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");
    }
}


相关文章推荐

POJ 1860 Currency Exchange(Bellman-Ford)

题目大意 给出n个顶点,m条边,原点s及初始金钱v。每条边有6个参数from, to, c1, r1, c2, r2。 假设在from出有v的金钱,从from -> to,金钱 = (v - c1) ...

POJ 1860 Currency Exchange (Bellman-Ford算法的运用)

题目类型  四边形不等式优化DP 题目意思 给出 n  (1 解题方法 很容易得出朴素的dp转移方程 dp[i][j] = Min( dp[i][k...

Bellman-Ford-POJ-1860-Currency Exchange

Currency Exchange Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 23595 Acc...

Bellman-ford变形 poj1860 Currency Exchange

//bellman-ford 算法 //判断有无环 //对于每条路进行更新,最大的环为n-1,所以最多进行n-1次更新(其实就是以s为原点的一个最短路的树) //那么对于第n次,还能进行更新那么就能存...

POJ 1860 Currency Exchange (Bellman-Ford 找正环)

Currency Exchange Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 19715 Accepte...

poj 1860 Currency Exchange (Bellman_ford 算法)

题目连接:点击打开链接 翻译题目: 城市里有几个货币兑换点,让我们假设每个点是给给两种特定的货币的进行相互兑换的操作,每个兑换点都有其自己的兑换率,且A到B的兑换率等同于B到A的兑换率。同样每个兑...
  • pzp1011
  • pzp1011
  • 2014年03月06日 20:56
  • 328

poj1860 Bellman_ford算法

各种小错误害我wa了好多遍。。饿着肚子搞啊搞终于AC了1860Accepted264K16MSC++1292B //poj1860 图论 只要有一个环,实现增加钱的目的,无限次循环这个环然后退出即...
  • chchlh
  • chchlh
  • 2014年11月25日 18:16
  • 430

POJ-1860 Currency Exchange(Bellman-Ford)

由于本题是要求走一圈后,权值变大,所以更改Bellman-Ford的初始条件和更新条件,即可更改为求已s为起点的“最长路”,因为更新方法变了,所以每次能更新到的点必定是s点可达的点,即也再可兑换回s,...

poj1860 Bellman-ford算法应用

题意 : 就是套汇的问题,汇率rab, 增加了一个手续费  cab 。。。。。。。每次的结果是  (本金 - 手续费) * 汇率,而且一个人拥有的钱的类型是已知的,拥有的value 钱的个数也是已知的...
  • lqcsp
  • lqcsp
  • 2013年06月01日 16:13
  • 650

POJ 1860 bellman-ford 的变形

/*题意:已知有n种货币,编号为1~n,以及它们之间的瑞换比例。现在 Nick有第fir种货币meney元,问你Nick能不能通过这些货币的瑞换规则, 使自己拿到更多的fir货币。 思路: bellm...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Bellman_Ford poj 1860
举报原因:
原因补充:

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