POJ 1860

  Bellman_Ford算法求解,只需将其改为求最长路,判断图中是否有正环存在,在执行松弛操作时如果某一次没有发生松弛操作,则只需判断d[s]与原始钱的数目的大小关系即可;如果成功的松弛完毕,则说明图中存在着正环,就可以使货币增值.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct Edge{
    int u,v;
    double rate,com;
};
Edge edge[205];
double d[105];

int n,m,s;
double v;

bool bellman_ford(){
    memset(d,0,sizeof(d));
    d[s]=v;
    //这儿一开始写的是循环n-1次,但是结果不对;比如可能v先减小,然后不断增加,这个次数就不一定了,所以和书中的不太一样 
    for(;d[s]<=v;){
        bool flag=false;
        for(int j=0;j<2*m;j++){
            double tmp=(d[edge[j].u]-edge[j].com)*edge[j].rate;
            if(d[edge[j].v]<tmp){
                d[edge[j].v]=tmp;
                flag=true;
            }
        }
        if(flag==false)
            return d[s]>v;
    }
    return true;
}
int main(){
    while(scanf("%d%d%d%lf",&n,&m,&s,&v)!=EOF){
        int u,v,k=0;
        double r1,c1,r2,c2;
        for(int i=0;i<m;i++){
            scanf("%d%d%lf%lf%lf%lf",&u,&v,&r1,&c1,&r2,&c2);
            edge[k].u=u;edge[k].v=v;
            edge[k].rate=r1;edge[k].com=c1;
            k++;
            edge[k].u=v;edge[k].v=u;
            edge[k].rate=r2;edge[k].com=c2;
            k++;
        }
        if(bellman_ford())
            printf("YES\n");
        else
            printf("NO\n");
    }
    //system("pause");
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值