bellman-ford算法(最短路、最短路劲)
来源:互联网 发布:淘宝哪家店代购lv靠谱 编辑:程序博客网 时间:2024/05/04 18:41
/****数据输入的格式为:*第一个数m:源点的下标*第二个数n:有多少个结点*输入n组数,每组数以0 0结束,且数据为邻接点与权值相间输入*//****(减少编程过程中常出现错误,减少编译或运行时的违规访问之后程序自动停止)*总结:1、一定要在确定申请或定义了相关空间之后,然后在对空间里的数据进行操作,目的是避免*超出范围访问(一定要在已定义的空间范围里);*2、准确的定义函数,调用函数时名称要一致(避免大小写差错),如果是要通过调用函数的形式*去改变实际地址里面的数据,那么就要在调用函数时将地址赋过去,要函数对实际地址里的值进行*操作然后相应的改变;*3、像本程序,Node型结点里面包含有三个值end、w、next其中前两个为整型、后一个为指针,因此*在给一个结点赋值时应同时将next赋值为NULL避免后续操作不必要的一些违规访问。*4、在对一个数组进行遍历时,要准确的使用for循环里的i,j,k,不要前一个for循环使用了j,但这*个循环为变量k遍历时却又使用了j。*/#include<iostream>#include<cstdlib>#include<fstream>using namespace std;const int MAX = 10000; //无穷大权值int d[21],t[21]; //最大20个结点的最短路的存储,d[]表示最短距离,t[]表示最短路径typedef struct Node{ //end表示边的尾端点 int end; int w; struct Node* next;}Node,*PNode;typedef struct Node1{ //c为结点名称 char c; PNode p;}Node1;Node1 N[21]; //最多20个结点的邻接表存储结构int bellmanford(int n); // 传递的n为结点数int main(){ ifstream cin("aaa.txt"); int b,m,n; //m为源点,n为结点个数,b表示判断有无负权回路 char a; PNode pp,pq;//结点指针 cin>>m>>n; for(int i = 1; i <= n; i++) { d[i] = MAX; } d[m] = 0; t[m] = 0; int j=1; int v=1; while(j <= n){ // 建立图的存储结构 cin>>a; N[j].c = a; N[j].p = NULL; int end1,w1; while(cin>>end1>>w1){ if(end1 == 0 && w1 == 0)break; pp = (PNode)malloc(sizeof(Node)); pp->end = end1; pp->w = w1; pp->next = NULL; if(v == 1) {N[j].p = pp; v++; pq = pp; continue;} pq->next = pp; pq = pp; } v = 1; j++; } b=bellmanford(n); if(b == 0){cout<<"存在负权回路";return 0;} for(int i = 1; i <= n; i++){ //将源点到其他每个点的最短距离以及路径输出 cout<<"第"<<i<<":"<<d[i]<<endl; j = i; while(1){ if(t[j] == 0){cout<<N[j].c<<endl; break;} cout<<N[j].c<<"<--"; j = t[j]; } } return 0;}int bellmanford(int n){ PNode pq; int i,j,k; for(i = 1; i <= n-1; i++){ for(j = 1; j <= n; j++){ pq = N[j].p; while(pq != NULL){ if(d[j] == MAX) {pq = pq->next; continue;} if(d[j] + pq->w < d[pq->end]){ d[pq->end] = d[j] + pq->w; t[pq->end] = j;} pq = pq->next; } } } for(k = 1; k <= n; k++){ pq = N[k].p; while(pq != NULL){ if(d[k] + pq->w < d[pq->end])return 0; pq = pq->next; } } return 1;}
0 0
- bellman-ford算法(最短路、最短路劲)
- bellman ford最短路算法
- 最短路--Bellman-Ford算法
- bellman-ford算法 最短路
- Bellman-ford最短路算法
- 最短路问题(Bellman-Ford算法)
- Bellman-Ford(最短路)
- 最短路 bellman-ford
- 最短路~bellman-ford
- 最短路-Bellman-Ford
- poj1860_最短路bellman Ford算法应用
- 最短路之Bellman-Ford算法
- 最短路——Bellman-ford算法
- 最短路问题 Bellman-Ford算法
- 最短路算法 Dijkstra Bellman-Ford SPFA
- 最短路——Bellman-Ford算法
- 算法训练 最短路 Bellman-Ford
- 最短路的bellman-ford算法
- c++第一天
- CentOS7下安装VMTools
- 实习日常(1)——提高代码质量:过度保护以及TDD,BDD
- CetOS 7.3配置初实战
- C++中的常量、引用和指针
- bellman-ford算法(最短路、最短路劲)
- 仿大锤子数字时钟
- xml 认识一
- 2017老萌新终于开通了CSDN博客
- D3D11进阶教程六之四叉树(QuadTree)
- STMemsAndroidHAL分析
- 写在2017年1月2日
- 硅谷跳槽工具箱指南
- AssetBundle的理解