图的最短路径算法(四)--Bellman-Ford(解决负权边)单源点最短路径
2016-08-29 22:06
369 查看
//含有负权边的单源点最短路径 //动态规划思想:两点之间的最短路径最多经过n-1边即可到达 //那么依次更新经过1条边,2条边,...,n-1条边的最短路径 #include<stdio.h> int main() { int dis[10],bak[10],i,k,n,m,u[10],v[10],w[10],check,flag; int inf=99999999; //读入n和m,n表示顶点个数,m表示边的条数 scanf("%d %d",&n,&m); //读入边 for(i=1;i<=m;i++) { scanf("%d %d %d",&u[i],&v[i],&w[i]); } //初始化dis数组,这里是1号顶点到其余各顶点的初始路程 for(i=1;i<=n;i++) dis[i]=inf; dis[1]=0; //Bellman-Ford算法核心语句 for(k=1;k<=n-1;k++) { //将dis数组备份到bak数组中 for(i=1;i<=n;i++) bak[i]=dis[i]; //进行一轮松弛 for(i=1;i<=m;i++) if(dis[v[i]]>dis[u[i]]+w[i]) //这里好像将图的边看成了有向边 dis[v[i]]=dis[u[i]]+w[i]; //松弛完毕后检测dis数组是否有更新 check=0; for(i=1;i<=n;i++) if(bak[i]!=dis[i]) { check=1; break; } if(check==0) break; //数组没有更新,提前退出循环算法 } //检测负权回路 flag=0; for(i=1;i<=m;i++) if(dis[v[i]]>dis[u[i]]+w[i]) flag=1; if(flag==1) printf("此图含负权回路"); else { //输出最终结果 for(i=1;i<=n;i++) printf("%d ",dis[i]); } return 0; } /* 5 5 2 3 2 1 2 -3 1 5 5 4 5 2 3 4 3 */
相关文章推荐
- 图论;单源最短路径;拓扑排序+松弛(有向无回路);Bellman-Ford(回路,负权回路);Dijkstra(无负权,可回路);可以用最小堆实现算法的优化;
- 图论;单源最短路径;拓扑排序+松弛(有向无回路);Bellman-Ford(回路,负权回路);Dijkstra(无负权,可回路);可以用最小堆实现算法的优化;
- 图论;单源最短路径;拓扑排序+松弛(有向无回路);Bellman-Ford(回路,负权回路)Dijkstra(无负权,可回路);可以用最小堆实现算法的优化;
- 单源最短路径:Dijkstra 算法 Bellman_Ford 算法 SPFA 算法
- POJ 1860 Currency Exchange Bellman-Ford算法求单源最短路径并判断是否有正权回路
- 赚钱啦(单源最短路径(含有负权)Bellman_Forld()算法)
- 图算法:2、计算带有负权值的单源最短路径:Bellman-Ford算法
- 单源最短路径算法 Bellman-Ford && SPFA 及 最短路算法统一归纳
- Bellman-Ford(贝尔曼-福特)算法求单源最短路径
- 单源最短路径算法 Bellman-Ford && SPFA 及 最短路算法统一归纳
- Bellman-Ford 算法 单源最短路径问题
- Bellman-ford算法求解单源点最短路径初始版本
- Bellman-Ford 算法实现单源最短路径
- 算法导论-第24章- 单源最短路径 - 24.1 Bellman-Ford 算法
- 单源最短路径 : Bellman-Ford 算法
- Bellman-Ford-解决负权边的最短路径
- 单源最短路径的Bellman-Ford 算法
- Bellman-Ford算法 单源最短路径(o(nm))
- 单源最短路径之Bellman-Ford 算法
- 51nod 1445 变色DNA ( Bellman-Ford算法求单源最短路径)