bellman-ford算法(最短路、最短路劲)

原创 2017年01月02日 21:16:32
/***
*数据输入的格式为:
*第一个数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算法 C语言实现

蓝桥杯 算法提高训练 最短路径 问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环)。请你计算从1号点到其他点的最短路(顶点从1到n编号)。 输入格式 第一行两个整...
  • qq_34845121
  • qq_34845121
  • 2017年02月12日 00:03
  • 812

最短路问题DijKstra算法Bellman-Ford和spfa算法

DijKstra算法核心在于一个数组d[Max],d[i]表示的是i这个节点距离中央节点的距离,算法想要实现得就是一步一步的更新d[Max],知道所有的点都被访问连接过才可退出 准备阶段 in...
  • Df_cjc
  • Df_cjc
  • 2018年01月29日 19:39
  • 38

最短路知识点总结(Dijkstra,Floyd,SPFA,Bellman-Ford)

最短路知识点总结(Dijkstra,Floyd,SPFA,Bellman-Ford) Dijkstra算法: 解决的问题:     带权重的有向图上单源最短路径问题。且权重都为非...
  • qq_33406883
  • qq_33406883
  • 2016年07月20日 17:55
  • 1468

【原创】求最短路径-SPFA算法

SPFA算法引子在很早很早以前,有个IOer兼BLOGer挖了一个坑:有一类问题,它要求我们从图上某点出发,走到另一点,求最短路径。 long long ago;我们学习了三种求最短路径的方法: F...
  • c20182030
  • c20182030
  • 2017年05月16日 14:10
  • 400

最短路问题(4种方法)(邻接矩阵,邻接表,bellman-ford,spfa)

以最简单的   Til the Cows Come Home    为例 点击打开链接 几种算法的核心思想就是,先找到距离起点最近的点,以它为松弛点,对所有的点进行松弛操作; 1.dijkstra-...
  • nhl19961226
  • nhl19961226
  • 2017年01月17日 11:48
  • 316

差分约束系统详解(转化为最短路)

转自:http://www.cnblogs.com/void/archive/2011/08/26/2153928.html
  • u012860063
  • u012860063
  • 2014年10月02日 09:59
  • 1304

动态规划求最短路(多方向)

#include "stdio.h"#include "math.h"#define  N 4#define  M 6void main(){ int a[N+2][M+2],b[N+2][M+2],...
  • zhoulingjie311
  • zhoulingjie311
  • 2011年03月02日 14:41
  • 1154

(最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法模板的整理与介绍

这一篇博客以一些OJ上的题目为载体,整理一下最短路径算法。会陆续的更新。。。   一、多源最短路算法——floyd算法       floyd算法主要用于求任意两点间的最短路径,也成最短最短路径问题。...
  • caihongshijie6
  • caihongshijie6
  • 2014年05月23日 19:45
  • 4969

次短路(第二最短路径)

第二最短路径 有句古话叫“不破不立”,这个思想跟次短路也就是第二最短路的思想一样。 算法思想:计算原图的最短路,并保存路径。一一破坏最短路中的每一条边,重新计算最短路,并排序。最小的那个就是第...
  • WayToAccept
  • WayToAccept
  • 2015年10月28日 21:27
  • 1701

算法-从动态规划到贪心算法,Bellman-Ford和Dijkstra算法求解最短路

对于Dijkstra这个神奇的算法,作者从本科学数据结构开始就觉得很奇妙。每次看都感觉这算法很精巧,但是看完就忘了。直到现在系统学习算法之后才明白总是遗忘它的真正原因,那就是没有从本质上去理解它。这篇...
  • hweiyi
  • hweiyi
  • 2017年10月27日 20:25
  • 362
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:bellman-ford算法(最短路、最短路劲)
举报原因:
原因补充:

(最多只允许输入30个字)