博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Bellman-Ford最短路径
阅读量:5052 次
发布时间:2019-06-12

本文共 1639 字,大约阅读时间需要 5 分钟。

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

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

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

1 #include
2 #include
3 #include
4 #include
5 const int inf=99999999; 6 using namespace std; 7 int main() 8 { 9 int u[105],v[105],dis[105],w[105],te[105];10 int m,n;11 while(cin>>n>>m){12 for(int i=1;i<=m;i++){13 cin>>u[i]>>v[i]>>w[i];14 }15 for(int i=1;i<=n;i++)16 17 dis[i]=inf;///初始值设为无穷大,这样就会从第一个结点开始逐渐松弛,向后面的结点开始扩展18 dis[1]=0;///将原点设为119 for(int i=1;i<=n-1;i++){20 for(int k=1;k<=n;k++)te[k]=dis[k];///这里把dis的初始值记录在te数组中,以便在后面我们判断是否所有的点都已经松弛完成,我们知道这个算法的最坏的情况是要松弛n-1次,但是在实际中很多情况我们提前就已经松弛完成啦,在这里加入这一步可以提前退出循环21 for(int j=1;j<=m;j++){22 if(dis[v[j]]>dis[u[j]]+w[j])23 dis[v[j]]=dis[u[j]]+w[j];24 }25 int check=0;26 for(int i=1;i<=n;i++){27 if(dis[i]!=te[i]){28 check=1;29 break;30 }31 }32 if(check==0)break;///当在新一轮的松弛中我们发现所有点的dis值都没有改变,这就表明所有的点都已经松弛完成啦33 }34 int flag=0;35 for(int i=1;i<=m;i++)36 if(dis[v[i]]>dis[u[i]]+w[i])flag=1;///当松弛完毕后如果还能找到可以继续松弛的边的话就代表含有负权边,我们通常用这种方法检查是否含有负权回路37 if(flag==1)cout<<"此图含有负权回路";38 else {39 40 for(int i=1;i<=n;i++)cout<
<<" ";41 cout<
View Code

 

转载于:https://www.cnblogs.com/shangjindexiaoqingnian/p/5878227.html

你可能感兴趣的文章
使用更改跟踪(ChangeTracking)来实现数据类型变更
查看>>
c++访问mysql数据库
查看>>
JAVA代码查错试题集
查看>>
C#中小数点后保留两位小数,四舍五入的函数及使用方法
查看>>
你的JavaBean是否真的需要实现Serializable
查看>>
CSS3效果:立体字和镂空字
查看>>
规范 : angular 组合 jquery plugin
查看>>
文字无缝向上滚动
查看>>
IE6,谢谢你,goodbye?
查看>>
mongoDB 索引的用法
查看>>
Linux +apache+fastcgi运行c/c++
查看>>
atitit。 hb Hibernate sql 查询使用
查看>>
相关Python分割操作
查看>>
Mac > 编写跨平台桌面应用开发工具,基于 Web 技术
查看>>
《人月神话》3
查看>>
拼接sql语句时拼接空字符串报sql错误
查看>>
模仿东京首页banner轮播,京东新闻上下滚动动画实现(动画实现)
查看>>
我们的何时能赶上MS的脚步
查看>>
UIWindow & UIWindowLevel笔记
查看>>
Eclipse的快捷键 收藏
查看>>