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

1.初始化时将起点 s 到各个顶点 v 的距离 dist(s->v) 赋值为 ∞,dist(s->s) 赋值为 ;

2.后续进⾏最多 n- 次遍历操作 (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<vector>
#include<cstring>
using namespace std;
const int maxx=5005;
const int inf=100000;
int dist[maxx];
int n,m,root,k;
int pre[maxx];
struct node{int u,v,w;
}num[maxx];
int Bellman_ford(int n,int m){dist[1]=0;for(int i=2;i<=n;i++){dist[i]=inf;}//松弛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;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 0;}}return 1;
}
int main(){int t;scanf("%d",&t);while(t--){scanf("%d %d %d",&n,&m,&k);int j=0;for(int i=1;i<=m;i++){int u,v,cost;scanf("%d %d %d",&u,&v,&cost);++j;num[j].u=u;num[j].v=v;num[j].w=cost;++j;num[j].u=v;num[j].v=u;num[j].w=cost;}for(int i=1;i<=k;i++){int u,v,cost;scanf("%d %d %d",&u,&v,&cost);++j;num[j].u=u;num[j].v=v;num[j].w=-cost;}if(Bellman_ford(n,j)){cout<<"NO"<<endl;}else{cout<<"YES"<<endl;}}return 0;
}

poj3259(Bellman_ford算法)相关推荐

  1. 含有负边的图的最短路径(Bellman_ford算法)

    更新所有的边,每条边更新V-1次,时间复杂度为O(V*E). 有些更新操作是重复了的,这里可以考虑检查多余的重复操作作,如果没有更新发生,则立即终止算法. #include<iostream&g ...

  2. Bellman_Ford算法

    Bellman_Ford算法和Dijkstra算法都可以用来求解有向图的单源最短路径问题,但是,相比于Dijkstra算法, Bellman_Ford算法允许边的权重为负值. 算法的详细讨论见算法导论 ...

  3. usaco Sweet Butter(迪杰斯特拉(优先队列优化),bellman_ford算法模板)

    这题开始用没有优化的迪杰斯特拉喜闻乐见的超时了,然后我用bellmanford算法按理说时间复杂度更大但是书上说往往只要很短的时间就可以求出最短路. 所以我用了这个算法但是我对这个算法还是不熟套了模板 ...

  4. *【POJ - 1860】Currency Exchange (单源最长路---Bellman_Ford算法判正环)

    题干: Description Several currency exchange points are working in our city. Let us suppose that each p ...

  5. 853. 有边数限制的最短路(bellman_ford算法)

    给定一个 nn 个点 mm 条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你求出从 11 号点到 nn 号点的最多经过 kk 条边的最短距离,如果无法从 11 号点走到 nn 号点,输出 ...

  6. Bellman_Ford算法(求一个点到任意一点的最短距离)

    单源最短路问题是固定一个起点,求它到任意一点最短路的问题. 记从起点出发到顶点 i 的最短距离为d[i],则有以下等式成立 d[i]=min{d[j]+(从j到 i 的边的权值) 看代码 #inclu ...

  7. bellman_ford算法 由边数限制的最短路

    首先认真读题:(acwing853) 给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你求出从 1 号点到 n号点的最多经过 k 条边的最短距离,如果无法从 1 号 ...

  8. poj 3259 时光穿梭问题 bellman_ford算法

    题意:有n个空地,有m条双向大路,w条时光隧道单向路.问能否回到过去? 思路:判断是否有负环存在,如果有负环存在那么就可以一直小就可以回到过去了 创建源顶点 V到其他顶点的距离d 初始为INF d[1 ...

  9. 【POJ - 3259 】Wormholes(Bellman_Ford或spfa算法,判断有向图中是否存在负环)

    题干: 农夫约翰在探索他的许多农场,发现了一些惊人的虫洞.虫洞是很奇特的,因为它是一个单向通道,可让你进入虫洞的前达到目的地!他的N(1≤N≤500)个农场被编号为1..N,之间有M(1≤M≤2500 ...

最新文章

  1. Android 开发中的多线程编程技术
  2. yii2地址多级联动
  3. [How TO]-git/gerrit配置方法
  4. linux系列服务总结之四:SAMBA共享设置完整介绍
  5. mysql outfile 变量_转mysql dumpfile 与 outfile 函数的区别
  6. WSP (无线会话协议)
  7. Android Intent的使用
  8. IOS发布应用照片大小
  9. Axure导入元件库和使用
  10. table在html是什么意思,html5中table指的是什么意思
  11. GYM 101350E. Competitive Seagulls (博弈
  12. MySQL比较两张表数据相同、不同结果记录
  13. java获取经纬度_java调用高德地图api获取某个位置的经纬度
  14. stm32运行java虚拟机_windows下的基于Eclipse的STM32开发调试环境搭建
  15. NBUT 1647 (多校连萌3)
  16. linux网卡断流测试,RouterOS断流解决办法探讨
  17. 【PDN仿真笔记6-使用Sigrity PowerSI进行PDN仿真的方法1】
  18. 太阳系发现的外星文明
  19. 争当表率 争做示范 | 华云数据荣获第十三届无锡市专利奖优秀奖!
  20. 运维工程师优秀员工评语

热门文章

  1. 跳跃游戏(判断是否可以跳到最后一个下标)
  2. 圆圈中最后剩下的数字
  3. 爬虫之谷歌浏览器xpath helper插件的安装和使用
  4. 机器视觉图像采集卡的功能与应用
  5. 没项目经验,如何砍下字节算法岗40万offer
  6. 1、交换机ARP缓存表分析
  7. MVC Html.ActionLink Area 链接中含区域的页面之间的跳转
  8. linux proxy服务器
  9. 将Centos的yum源更换为国内的阿里云源
  10. react中试用leaflet简单起步