poj1860(Bellman-Ford算法)
题意:首先给出四个数字: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算法)相关推荐
- bellman ford 算法 判断是否存在负环
Flyer 目录视图 摘要视图 订阅 微信小程序实战项目--点餐系统 程序员11月书讯,评论得书啦 Get IT技能知识库,50个领域一键直达 关闭 bellman for ...
- Bellman——Ford算法
Bellman--Ford 算法介绍 思路讲解 案例分析与代码实现 案例分析 代码实现 优先队列优化(SPFA) 优化原理 代码实现 算法介绍 我们知道Dijkstra算法只能用来解决正权图的单源最短 ...
- bellman - ford算法c++
(最短路III)bellman - ford算法(适用于含负权边的图) 注意:用该算法求最短路,在有边数限制的情况下可以存在负权回路!且对所走的边的数量有要求时只能用该算法实现! 解析:因为如果没有边 ...
- Bellman Ford算法详解
一.用途 1. Bellman Ford算法是解决拥有负权边最短路问题的方法之一.还有一种方法是SPFA算法. 2. 二者相比,SPFA算法在效率方面是优于Bellman Ford算法的.但在某些情况 ...
- Bellman ford算法(贝尔曼·福特算法)
Bellman - ford算法是求含负权图的单源最短路径的一种算法,效率较低,代码难度较小.其原理为连续进行松弛,在每次松弛时把每条边都更新一下,若在n-1次松弛后还能更新,则说明图中有负环,因此无 ...
- 图解Bellman Ford算法
Bellman Ford 单源最短路径算法[中字] Bellman Ford 单源最短路径算法[中字]_哔哩哔哩_bilibili 贝尔曼-福特算法(Bellman–Ford algorithm )油 ...
- LeetCode 787. K 站中转内最便宜的航班(图/Bellman Ford算法)
文章目录 贝尔曼-福特算法(Bellman-Ford) 简介 算法思想 算法执行过程 应用 题目描述 分析 代码 LeetCode 787. K 站中转内最便宜的航班 题目描述 Bellman For ...
- bellman ford 算法
Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的.这时候,就需要使用其他的算法来求解最短 ...
- 单源最小路径BellMan Ford算法
Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法. 输入:带权图 输出:从第0个点到其他点的最短路径值 B ...
- c语言bellman算法,求 最短路径中BELLMAN FORD算法实现的C程序
匿名用户 1级 2010-06-01 回答 //这个是邻接表 typedef struct oo { int len,num; struct oo *next; } link; typedef str ...
最新文章
- 【Effective Java】1.静态工厂方法来替换构造函数
- ppt 的局部分大功能软件介绍.ZoomIt
- 微服务中集成分布式配置中心 Apollo
- 我们是如何通过全球第一免费开源ERP Odoo做到项目100%交付
- ashx连接mysql_对C#中的web访问mysql数据库的一些知识点进行了整理归纳总结
- BZOJ3157/BZOJ3516 国王奇遇记(矩阵快速幂/数学)
- 七月算法机器学习1 相关数学基础
- vue uniapp通用省市下拉选择器组件 布局样式可灵活根据ui变更 (区域 可根据数组嵌套的格式继续往下模仿即可)
- 软件测试质量度量,软件测试过程质量的度量
- Create WAP Push SMS Messages
- mysql数据库索引的科普
- PDF文件解密方法是什么?PDF转换器有什么优点?
- 两轮电动车仪表头盔对讲中的蓝牙方案
- 全媒体群管理平台软件,有哪些功能?
- SSL证书有什么用?
- 导致企业应用软件难于治理的根源分析 一. 独狼程序
- 记一次使用compiz失败及抢救过程
- 基于单片机的智能油烟机
- 自学进微软——我的编程算法学习心得
- Python使用numpy与pandas计算数组元素的变化率