思路:如果u->v不存在环,则最多进行n-1次松弛操作,但是如果存在环的话,那么在进行第n次的松弛操作存在更优路径,所以这道题只要判断出有环,那么就存在套利可行(Bellman-ford也可以求解含负权图的单源最短路径)
这道题要注意套利的公式计算:题目中:0.5*10.0*0.21=1.05

方法一:Bellman-ford()算法
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<cstdio>
using namespace std;
const int maxx=105;
const int inf=0x3f3f3f3f;
struct node{int u,v;double w;
}num[maxx<<4];
double dist[maxx<<4];
int n,m;
int pre[maxx<<4];
map<string,int>mp;
int Bellman_ford(int n,int m,int u){for(int i=1;i<=n;i++){dist[i]=0;}dist[u]=1;int flag;//松弛操作 for(int i=1;i<=n-1;i++){flag=1;for(int j=1;j<=m;j++){if(dist[num[j].v]<dist[num[j].u]*num[j].w){dist[num[j].v]=dist[num[j].u]*num[j].w;pre[num[j].v]=num[j].u;flag=0;}}if(flag==1)break;}//如果还存在更优,则存在环 for(int i=1;i<=m;i++){if(dist[num[i].v]<dist[num[i].u]*num[i].w){return 1;}}return 0;
}
int main(){int count=1;while(scanf("%d",&n)!=EOF){if(n==0)break;for(int i=1;i<=n;i++){string s;cin>>s;mp[s]=i;}scanf("%d",&m);for(int i=1;i<=m;i++){string s,s1;double rate;cin>>s>>rate>>s1;num[i].u=mp[s];num[i].v=mp[s1];num[i].w=rate;}cout<<"Case "<<count++<<": ";for(int i=1;i<=n;i++){//枚举了所有点为起点 判断是否存在环 if(Bellman_ford(n,m,i)){cout<<"Yes"<<endl;break;}else if(i==n){cout<<"No"<<endl;}}}return 0;
}
方法二:Folyd()算法
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<cstdio>
using namespace std;
const int maxx=105;
const int inf=0x3f3f3f3f;
struct node{int u,v;double w;
}num[maxx<<4];
double dist[maxx<<4][maxx<<4];
int n,m;
int pre[maxx<<4];
map<string,int>mp;
void Floyd(int n,int m){for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){dist[i][j]=max(dist[i][j],dist[i][k]*dist[k][j]);}}}//如果i->i的money(原来设置为1)增加,则表明i->x->y...->i是存在这样一个环的,其实只要存在环,都可以通过循环到达自身 for(int i=1;i<=n;i++){if(dist[i][i]>1){cout<<"Yes"<<endl;break;}else if(i==n){cout<<"No"<<endl;}}
}
int main(){int count=1;while(scanf("%d",&n)!=EOF){if(n==0)break;for(int i=1;i<=n;i++){string s;cin>>s;mp[s]=i;}scanf("%d",&m);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i==j){//自身也是环 dist[i][j]=1;}else{dist[i][j]=0;}}}for(int i=1;i<=m;i++){string s,s1;double rate;cin>>s>>rate>>s1;dist[mp[s]][mp[s1]]=rate;//注意这里不是这样 ist[mp[s]][mp[s1]]=dist[mp[s1]][mp[s]]=rate}cout<<"Case "<<count++<<": ";Floyd(n,m);}return 0;
}

poj2240(Bellman-ford)相关推荐

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

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

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

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

  3. C++实现bellman ford贝尔曼-福特算法(最短路径)(附完整源码)

    C++实现bellman ford贝尔曼-福特算法 实现bellman ford贝尔曼-福特算法的完整源码(定义,实现,main函数测试) 实现bellman ford贝尔曼-福特算法的完整源码(定义 ...

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

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

  5. SPFA or bellman ford松弛法--单源最短路

    问题概述:有编号1-n的n个站点,有m条公交车路线,公交车只从一个起点站直接到达终点站,是单向的且每条路线有它自己的车费,有P个人早上从1出发,他们要到达每一个公交站点,然后到了晚上再返回点1,求所有 ...

  6. Bellman——Ford算法

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

  7. bellman - ford算法c++

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

  8. Bellman Ford算法详解

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

  9. 图解Bellman Ford算法

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

  10. bellman ford 算法

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

最新文章

  1. 零基础如何学习软件测试
  2. 电脑耳机声音小怎么调大_录自媒体vlog视频声音小怎么办,看兰哥怎样不花钱就解决...
  3. 如何使用视频转换器将flv格式文件转换为MP4格式
  4. seleniumIDE
  5. python chm制作_生成chm文档的方法
  6. eclipse 面包屑开关 / 查看class再哪个jar中
  7. 博客园开始对X++语言语法高亮的支持
  8. 给大家推荐一个优质Linux内核技术公众号-Linux阅码场
  9. 异常:Invalid character found in the request target. The valid characters are defined in RFC 3986
  10. PAP和CHAP认证
  11. RC积分器充放电过程
  12. 用拉普拉斯变换求零状态响应_【解析几何】椭圆的仿射变换(伸缩变换)
  13. 如何设置对话框的最大(小)高度与宽度
  14. 企业邮箱使用安全注意事项
  15. 【叶子函数分享二十三】计算两个日期之间的工作日
  16. 模糊神经网络(二)神经网络
  17. HtmlEncode是做什么的?
  18. 用CentOS 7打造合适的科研环境 :zhuan
  19. 原神ps无法登录服务器未响应,原神公测常见问题与解答,包括配置需求、数据互通问题...
  20. Ubuntu环境R程序安装ncdf4包:错误,找不到nc-config或不可执行

热门文章

  1. RESTful之自动生成接口文档
  2. Serializer反序列化使用之验证和保存
  3. windows下:ERROR 1366 (HY000): Incorrect string value: ‘\xC1\xF5\xB1\xB8‘ for column ‘name‘ at row 1
  4. 爬虫之requests模块在headers参数中携带cookie发送请求
  5. 如何让自己在云服务器上部署的项目一直运行
  6. CNN模型之MobileNet
  7. 汇总 | OpenCV4中的非典型深度学习模型
  8. 基于OpenCV的显著图绘制
  9. 链表问题10——两个单链表生成相加链表(方法二)
  10. Ubuntu 18.04缺少libgconf-2.so.4