题意:首先给出四个数字:n–货币数量,M–交换点数,S–货币尼克的数量,V–他拥有的货币单位的数量;
后面的M行给出每个兑换点可以用6个数字来描述:整数A和B——它兑换的货币数量,以及实际RAB、CAB、RBA和CBA——A兑换B和B兑换A时的汇率和佣金。
思路:采用Bellman-Ford算法:
1.初始化时将起点 s 到各个顶点 v 的距离 dist(s->v) 赋值为 ∞,dist(s->s) 赋值为 0
2.后续进⾏最多 n-1 次遍历操作 (n 为顶点个数), 对所有的边进⾏松弛操作;
所谓的松弛,以边 ab 为例,若 dist(a) 代表起点 s 到达 a 点所需要花费的总数,dist(b) 代表起点 s 到达 b 点所需要花费的总数,weight(ab)代表边 ab 权重,若存在: dist(a) +weight(ab) < dist(b),则说明存在到 b 的更短的路径,s->...->a->b, 更新 b 点的总花费为 (dist(a) +weight(ab)),⽗节点为 a
3.遍历都结束后,若再进⾏⼀次遍历,还能得到 s 到某些节点更短的路径的话(dist(a) +weight(ab) < dist(b),则图中存在负环路,即是说该图无法求出单源最短路径。否则数组dist[n]中记录的就是源点s到各顶点的最短路径长度),则说明存在负环路
判断负环就完成循环以后再找⼀次,若还能更新,则有负环

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<iomanip>
using namespace std;
const int maxx=303;
const int inf=0x3f3f3f3f;
int n,m;
int S;
double dist[maxx];
double V;
int A,B;
double RAB,CAB,RBA,CBA;
struct node{int u;int v;double rate;double  commission;node(){}node(int u,int v,double rate,double  commission){this->u=u;this->v=v;this->rate=rate;this->commission=commission;}
}a[maxx];
int Bellman_Ford(int n,int m){dist[S]=V;for(int i=0;i<n-1;i++){int flag=0;for(int j=1;j<=m;j++){double temp=(dist[a[j].u]-a[j].commission)*a[j].rate;if(temp>dist[a[j].v]){dist[a[j].v]=temp;flag=1;}}if(flag==0)return 0;}for(int i=1;i<=m;i++){double temp=(dist[a[i].u]-a[i].commission)*a[i].rate;if(temp>dist[a[i].v]){return 1;}}return 0;
}
int main(){while(scanf("%d %d %d %lf",&n,&m,&S,&V)!=EOF){memset(dist,0,sizeof(dist));int cnt=0;for(int i=1;i<=m;i++){cnt++;cin>>A>>B>>RAB>>CAB>>RBA>>CBA;a[cnt].u=A;a[cnt].v=B;a[cnt].rate=RAB;a[cnt].commission=CAB;cnt++;a[cnt].u=B;a[cnt].v=A;a[cnt].rate=RBA;a[cnt].commission=CBA;}int flag=Bellman_Ford(n,cnt);if(flag){cout<<"YES"<<endl;}else{cout<<"NO"<<endl;}}return 0;
}

poj1860(Bellman-Ford算法)相关推荐

  1. bellman ford 算法 判断是否存在负环

    Flyer 目录视图 摘要视图 订阅 微信小程序实战项目--点餐系统        程序员11月书讯,评论得书啦        Get IT技能知识库,50个领域一键直达 关闭 bellman for ...

  2. Bellman——Ford算法

    Bellman--Ford 算法介绍 思路讲解 案例分析与代码实现 案例分析 代码实现 优先队列优化(SPFA) 优化原理 代码实现 算法介绍 我们知道Dijkstra算法只能用来解决正权图的单源最短 ...

  3. bellman - ford算法c++

    (最短路III)bellman - ford算法(适用于含负权边的图) 注意:用该算法求最短路,在有边数限制的情况下可以存在负权回路!且对所走的边的数量有要求时只能用该算法实现! 解析:因为如果没有边 ...

  4. Bellman Ford算法详解

    一.用途 1. Bellman Ford算法是解决拥有负权边最短路问题的方法之一.还有一种方法是SPFA算法. 2. 二者相比,SPFA算法在效率方面是优于Bellman Ford算法的.但在某些情况 ...

  5. Bellman ford算法(贝尔曼·福特算法)

    Bellman - ford算法是求含负权图的单源最短路径的一种算法,效率较低,代码难度较小.其原理为连续进行松弛,在每次松弛时把每条边都更新一下,若在n-1次松弛后还能更新,则说明图中有负环,因此无 ...

  6. 图解Bellman Ford算法

    Bellman Ford 单源最短路径算法[中字] Bellman Ford 单源最短路径算法[中字]_哔哩哔哩_bilibili 贝尔曼-福特算法(Bellman–Ford algorithm )油 ...

  7. LeetCode 787. K 站中转内最便宜的航班(图/Bellman Ford算法)

    文章目录 贝尔曼-福特算法(Bellman-Ford) 简介 算法思想 算法执行过程 应用 题目描述 分析 代码 LeetCode 787. K 站中转内最便宜的航班 题目描述 Bellman For ...

  8. bellman ford 算法

    Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的.这时候,就需要使用其他的算法来求解最短 ...

  9. 单源最小路径BellMan Ford算法

    Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法. 输入:带权图 输出:从第0个点到其他点的最短路径值 B ...

  10. c语言bellman算法,求 最短路径中BELLMAN FORD算法实现的C程序

    匿名用户 1级 2010-06-01 回答 //这个是邻接表 typedef struct oo { int len,num; struct oo *next; } link; typedef str ...

最新文章

  1. 【Effective Java】1.静态工厂方法来替换构造函数
  2. ppt 的局部分大功能软件介绍.ZoomIt
  3. 微服务中集成分布式配置中心 Apollo
  4. 我们是如何通过全球第一免费开源ERP Odoo做到项目100%交付
  5. ashx连接mysql_对C#中的web访问mysql数据库的一些知识点进行了整理归纳总结
  6. BZOJ3157/BZOJ3516 国王奇遇记(矩阵快速幂/数学)
  7. 七月算法机器学习1 相关数学基础
  8. vue uniapp通用省市下拉选择器组件 布局样式可灵活根据ui变更 (区域 可根据数组嵌套的格式继续往下模仿即可)
  9. 软件测试质量度量,软件测试过程质量的度量
  10. Create WAP Push SMS Messages
  11. mysql数据库索引的科普
  12. PDF文件解密方法是什么?PDF转换器有什么优点?
  13. 两轮电动车仪表头盔对讲中的蓝牙方案
  14. 全媒体群管理平台软件,有哪些功能?
  15. SSL证书有什么用?
  16. 导致企业应用软件难于治理的根源分析 一.  独狼程序
  17. 记一次使用compiz失败及抢救过程
  18. 基于单片机的智能油烟机
  19. 自学进微软——我的编程算法学习心得
  20. Python使用numpy与pandas计算数组元素的变化率

热门文章

  1. 面向高精度领域的视觉伺服算法汇总
  2. 基于多阈值注意U-Net(MTAU)的MRI多模态脑肿瘤分割模型
  3. JDK, JRE和JVM的区别与联系
  4. hadoop day 3
  5. 【转】DHCP工作过程详解
  6. 分布式团队面临的五大问题及解决办法
  7. Mysql 内部结构 / Replication | 原理
  8. MySQL 关于毫秒和微秒的处理,MySQL获取毫秒!
  9. 【Joomla】本地化汇总
  10. ViewBag、ViewData和TempData使用方法、区别与联系