/*** *数据输入的格式为: *第一个数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;
}
bellman-ford算法(最短路、最短路劲)
原文作者:Bellman - ford算法
原文地址: https://blog.csdn.net/qq_36212394/article/details/53982273
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/qq_36212394/article/details/53982273
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。