【图】最短路径Bellman-Ford算法
2016-04-04 22:39
393 查看
#include<iostream> using namespace std; const int max_num = 500; const int max_len = 10000; typedef struct Edge{ int begin;//起点 int end;//终点 int weight;//权值 }Edge; class BellmanFord{ public: void read_case(); void print_result(); void print_path(int end); private: bool bellman_ford(); private: int node_num;//图的结点数 int edge_num;//图的路径数 int start; //源点 Edge edge[max_num]; int distance[max_num];//结点到源点最小距离 int pre[max_num];//源点到节点的路径 }; void BellmanFord::read_case(){ cin >> node_num >> edge_num >> start; for (int i = 1; i <= edge_num; i++){ distance[i] = max_num; pre[i] = i; } distance[start] = 0; for (int i = 1; i <= edge_num; i++){ cin >> edge[i].begin >> edge[i].end >> edge[i].weight; if (edge[i].begin == start){//注意这里设置初始情况 distance[edge[i].end] = edge[i].weight; pre[edge[i].end] = start; } } } bool BellmanFord::bellman_ford(){ for (int i = 1; i < node_num; i++){ for (int j = 1; j <= edge_num; j++){//松弛计算 if (distance[edge[j].end]>distance[edge[j].begin] + edge[j].weight){ distance[edge[j].end] = distance[edge[j].begin] + edge[j].weight; pre[edge[j].end] = edge[j].begin; } } } bool flag = true; //判断是否有负环路 for (int j = 1; j <= edge_num; j++){ if (distance[edge[j].end]>distance[edge[j].begin] + edge[j].weight){ flag = false; break; } } return flag; } void BellmanFord::print_result(){ if (bellman_ford()) for (int i = 1; i <= node_num; i++){ cout << distance[i] << endl; print_path(i); } else cout << "有负环" << endl; } void BellmanFord::print_path(int end){ int que[max_num]; int count = 1; que[count] = end; count++; int tmp = pre[end]; while (tmp != start){ que[count] = tmp; count++; tmp = pre[tmp]; } que[count] = start; cout << "源点到顶点"<<end<<"的路径为: "; for (int i = count; i >= 1; i--) if (i != 1) cout << que[i] << " -> "; else cout << que[i] << endl; } int main(){ BellmanFord bellman_ford; bellman_ford.read_case(); bellman_ford.print_result(); return 0; }
相关文章推荐
- 控制器转场动画自定义(1):push/pop的实现
- 设计模式之创造者模式 Builder
- 真正意义上第一个APP 可以用的 老黄历~~~
- Shell脚本学习之sed详解
- iOS的Http、TCP、UDP
- background-position和雪碧图(CSS Sprites)用法
- 典型的错误码和错误信息匹配代码------本质就是key value匹配
- 复位windows网络参数的方法
- 是时候复习一下Java基础了(三)
- poj 1195(二维线段树||二维树状数组)
- android_ListView的操作
- 复位windows网络参数的方法
- 复位windows网络参数的方法
- Execution failed for task ':app:mergeDebugResources'. > Some file crunching failed, see logs for det
- android开发之应用Crash自动抓取Log_自动保存崩溃日志到本地
- 4Sum
- C语言学习007:重定向标准输入和输出
- << React Native 入门与实战>>----第3章 常用组件及实战
- ECMAScript 2015 (ES6) in Node.js(译)
- 四、基础 函数(数学 日期 字符串)、流程控制、循环