POJ1860 Currency Exchange 最短路Bellman Ford变形

本文深入探讨了如何使用Bellman-Ford算法来判断图中是否存在正权环,详细解析了算法原理及其实现过程,通过代码示例展示了如何在实际问题中应用这一算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题一看应该就是判环,然后就不会了QAQ...看了网上说的,只要判断是否有正环,那么循环无数次之后一定可以赚回本钱。说实话bellman_ford算法我用的不多。。这次也是懵逼了。。参考博客是kuangbin的Orz:https://www.cnblogs.com/kuangbin/archive/2012/08/17/2644807.html

正环是刚好和板子反的,注意点都在代码里了,AC代码如下:

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int INF=0x3f3f3f3f;

const int MAX=105;
int n,m,s;
double vv;
struct Edge
{
    int u,v;
    double r,c;
}e[MAX*2];//注意×2!!!
int tol;
void addedge(int u,int v,double r,double c)
{
    e[tol].u=u;e[tol].v=v;e[tol].r=r;e[tol++].c=c;
}

double dis[MAX];//注意double!
bool bellman_ford(int st,double num)
{
    memset(dis,0,sizeof(dis));
    dis[st]=num;//注意!!!!!!
    for(int k=1;k<n;k++)//n-1次
    {
        bool flag=false;
        for(int i=0;i<tol;i++)
        {
            int u=e[i].u,v=e[i].v;
            double r=e[i].r,c=e[i].c;
            if(dis[v]<(dis[u]-c)*r) //求最大
            {
                flag=true;
                dis[v]=(dis[u]-c)*r;
            }
        }
        if(!flag) return true;//没有回路
    }
    for(int i=0;i<tol;i++)
    {
        int u=e[i].u,v=e[i].v;
        double r=e[i].r,c=e[i].c;
        if(dis[v]<(dis[u]-c)*r)
            return false;//有回路
    }
    return true;
}
int main()
{
    while(scanf("%d%d%d%lf",&n,&m,&s,&vv)==4)
    {
        tol=0;
        int u,v;//注意区别v和vv!!!!!!!!
        double r,c;//注意double!
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&u,&v);
            scanf("%lf%lf",&r,&c);
            addedge(u,v,r,c);
            scanf("%lf%lf",&r,&c);
            addedge(v,u,r,c);
        }
        if(bellman_ford(s,vv)) printf("NO\n");
        else printf("YES\n");
    }
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值