对于前面说到的最短路径的求解方法,不能解决负权边的情况,而Bellman-Ford却可以

共有n个顶点,m条边,每次输入u[i],v[i],w[i],代表从u[i]到v[i]的距离是w[i],对于所有的顶点进行n-1次松弛

更多详细的内容在代码中会讲解,大家还是直接看代码吧^...^

 #include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
const int inf=;
using namespace std;
int main()
{
int u[],v[],dis[],w[],te[];
int m,n;
while(cin>>n>>m){
for(int i=;i<=m;i++){
cin>>u[i]>>v[i]>>w[i];
}
for(int i=;i<=n;i++) dis[i]=inf;///初始值设为无穷大,这样就会从第一个结点开始逐渐松弛,向后面的结点开始扩展
dis[]=;///将原点设为1
for(int i=;i<=n-;i++){
for(int k=;k<=n;k++)te[k]=dis[k];///这里把dis的初始值记录在te数组中,以便在后面我们判断是否所有的点都已经松弛完成,我们知道这个算法的最坏的情况是要松弛n-1次,但是在实际中很多情况我们提前就已经松弛完成啦,在这里加入这一步可以提前退出循环
for(int j=;j<=m;j++){
if(dis[v[j]]>dis[u[j]]+w[j])
dis[v[j]]=dis[u[j]]+w[j];
}
int check=;
for(int i=;i<=n;i++){
if(dis[i]!=te[i]){
check=;
break;
}
}
if(check==)break;///当在新一轮的松弛中我们发现所有点的dis值都没有改变,这就表明所有的点都已经松弛完成啦
}
int flag=;
for(int i=;i<=m;i++)
if(dis[v[i]]>dis[u[i]]+w[i])flag=;///当松弛完毕后如果还能找到可以继续松弛的边的话就代表含有负权边,我们通常用这种方法检查是否含有负权回路
if(flag==)cout<<"此图含有负权回路";
else { for(int i=;i<=n;i++)cout<<dis[i]<<" ";
cout<<endl;
}
}
}

Bellman-Ford最短路径的更多相关文章

  1. Bellman - Ford 算法解决最短路径问题

    Bellman - Ford 算法: 一:基本算法 对于单源最短路径问题,上一篇文章中介绍了 Dijkstra 算法,但是由于 Dijkstra 算法局限于解决非负权的最短路径问题,对于带负权的图就力 ...

  2. ACM/ICPC 之 最短路径-Bellman Ford范例(POJ1556-POJ2240)

    两道Bellman Ford解最短路的范例,Bellman Ford只是一种最短路的方法,两道都可以用dijkstra, SPFA做. Bellman Ford解法是将每条边遍历一次,遍历一次所有边可 ...

  3. Bellman—Ford算法思想

    ---恢复内容开始--- Bellman—Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题.对于给定的带权(有向或无向)图G=(V,E),其源点为s,加权函数w是边集E的映射.对图G ...

  4. poj1860 bellman—ford队列优化 Currency Exchange

    Currency Exchange Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 22123   Accepted: 799 ...

  5. uva 558 - Wormholes(Bellman Ford判断负环)

    题目链接:558 - Wormholes 题目大意:给出n和m,表示有n个点,然后给出m条边,然后判断给出的有向图中是否存在负环. 解题思路:利用Bellman Ford算法,若进行第n次松弛时,还能 ...

  6. 图论算法——最短路径Dijkstra,Floyd,Bellman Ford

    算法名称 适用范围 算法过程 Dijkstra 无负权 从s开始,选择尚未完成的点中,distance最小的点,对其所有边进行松弛:直到所有结点都已完成 Bellman-Ford 可用有负权 依次对所 ...

  7. Dijkstra算法与Bellman - Ford算法示例(源自网上大牛的博客)【图论】

    题意:题目大意:有N个点,给出从a点到b点的距离,当然a和b是互相可以抵达的,问从1到n的最短距离 poj2387 Description Bessie is out in the field and ...

  8. POJ 2240 Arbitrage (Bellman Ford判正环)

    Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions:27167   Accepted: 11440 Descri ...

  9. PKU 3169 Layout(差分约束系统+Bellman Ford)

    题目大意:原题链接 当排队等候喂食时,奶牛喜欢和它们的朋友站得靠近些.FJ有N(2<=N<=1000)头奶牛,编号从1到N,沿一条直线站着等候喂食.奶牛排在队伍中的顺序和它们的编号是相同的 ...

  10. poj1860 兑换货币(bellman ford判断正环)

    传送门:点击打开链接 题目大意:一个城市有n种货币,m个货币交换点,你有v的钱,每个交换点只能交换两种货币,(A换B或者B换A),每一次交换都有独特的汇率和手续费,问你存不存在一种换法使原来的钱更多. ...

随机推荐

  1. Read/Write file in Android

    http://www.cnblogs.com/freeliver54/archive/2011/09/16/2178910.html

  2. GoldenGate 12.2 支持不可见列invisible column的复制

    Oracle Goldengate 12.2现在可以复制不可见列,在以前的版本中是没有此项功能的.示例:在源和目标都创建一个不可见和虚拟列commission SQL>  create tabl ...

  3. 4、时间同步ntp服务的安装于配置(作为客户端的配置)

    yum安装ntpd服务   .yum -y install ntp ntpdate (安装时间同步ntp服务) . vi /etc/ntp.conf (修改ntpd服务的配置文件)   3.修改配置文 ...

  4. android基础(二)Broadcast Receiver知识

    1.广播的注册 (1)动态广播注册: 优点:可以灵活控制广播的注册与撤销 缺点:必须在程序启动时才能接收广播 IntentFilter :当Intent在组建之间传递时,组件想告诉android系统自 ...

  5. HttpClient(4.3.3)实例讲解

    HttpClient的作用强大,真的是十分强大. 本实例是基于v4.3.3写的,,作用是模拟登陆后进行上下班打卡,,,使用htmlparser进行解析返回的html文件 关于HttpClient的一些 ...

  6. UVALive 7338 (树链剖分+线段树)

    Problem Toll Management IV 题目大意 给一张n个点m条边的无向图,有边权.数据保证前n-1条边构成了一棵最小生成树. 要求对于每条边求出其边权上下最多浮动范围,使得最小生成树 ...

  7. B/S和C/S测试的区别

        B/S(Brower/Server)以访问方式为主,包含客户端浏览器.web应用服务器.数据库服务器的软件系统.一般的B/S结构,都是多层架构的,有界面层.业务逻辑层.数据层.由于这种结构不需 ...

  8. 转:GROUPING SETS、ROLLUP、CUBE

    转:http://blog.csdn.net/shangboerds/article/details/5193211 大家对GROUP BY应该比较熟悉,如果你感觉自己并不完全理解GROUP BY,那 ...

  9. GridView的DataFormatString格式化字符串

    DataFormatString="{0:格式字符串}" 0:代表字段本身 冒号后面的代表希望的格式 比如 {0:yyyy-MM-dd}  显示的时间类型就是2016-04-11 ...

  10. 【NOIP2005】过河

    感觉这题好玄--最后看了chty的代码才过,我现在这样必须看题解才能A题怎么办嘛qaq 原题: 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上 ...