博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初学图论-Bellman-Ford单源最短路径算法
阅读量:6569 次
发布时间:2019-06-24

本文共 2011 字,大约阅读时间需要 6 分钟。

hot3.png

    本文使用C++实现了这一基本算法。参考《算法导论》第24.1节

    笔者使用了vector实现邻接链表,以提高运行效率。

/** * Bellman-Ford's Single Source Shortest Path Algorithm in C++ * Time Cost : O(|N||M|) * Introduction to Algorithms (CLRS) 24.1 * Author: Zheng Chen / Arclabs001 * Copyright 2015 Xi'an University of Posts & Telecommunications */#include 
#include 
#include 
#define INF 0xfffffffusing namespace std;const int N = 5;const int M = 10;ifstream in;struct edge{    int dest;    int weight;};struct vertex{    int num;    int dist;    int inDegree,outDegree;    vertex * parent;}V[N];vector
 AdjList[N];bool changes; //To check if there is changes in the loop//Suppose the longest way has m edges, so the distance will not change after//m loops, so that we can terminate the loop after m+1 times.void initialize(int s){    for(int i=0; i
>_start>>_dest>>_weight;        tmp->dest = _dest;        tmp->weight = _weight;        V[_start].outDegree++;        V[_dest].inDegree++;        AdjList[_start].push_back(*tmp);    }    V[s].dist = 0;}void relax(int u, int v, int weight)  //The "relax" operation{    if(V[v].dist > V[u].dist + weight)    {        V[v].dist = V[u].dist + weight;        V[v].parent = &V[u];        changes = true;    }}bool bellman_ford(int s){    changes = true;    initialize(s);    for(int k=1; k
 V[i].dist + tmp.weight)                return false;        }    }    return true;}int main(){    in.open("Bellman_Ford.txt");    if(bellman_ford(0))    {        cout<<"Succeed ! The distance of each vertex are :"<
<
<<" ";        }        cout<
<<"Their parents are :";        for(int i=1; i
<
num<<" ";        }    }    else    {        cout<<"Failed ! There are at least one negative circle !"<
 u.d + w(u,v))        v.d = u.d + w(u,v)        v.parent = u}Bellman-Ford(G,w,s){    Initialize-Single-Source(G,s)    for i=1 to |G.V|-1        for each vertex (u,v) in G.E            Relax(v,u,w)    for each edge (u,v) in G.E        if(v.d > u.d + w(u,v))            return FALSE    return TRUE}*/

//Bellma-Ford文件内容如下:

0 1 6

0 3 7

1 2 5

1 3 8

1 4 -4

2 1 -2

3 2 -3

3 4 9

4 2 7

4 0 2

每一行的三个元素分别表示某条边的起始节点、终止节点、这条边的权重。

转载于:https://my.oschina.net/bgbfbsdchenzheng/blog/488799

你可能感兴趣的文章
python3 在不同操作系统安装第三方库方法
查看>>
spark shuffle:分区原理及相关的疑问
查看>>
Laravel5.5 使用第三方Vendor添加注册验证码
查看>>
mysql优化
查看>>
Gradle -help
查看>>
css3做的nav
查看>>
css选择器顺序的小技巧
查看>>
互联网架构师必备技术 Docker仓库与Java应用服务动态发布那些事
查看>>
Intellij IDEA 2018.2 搭建Spring Boot 应用
查看>>
SNMP AGENT函数介绍
查看>>
Git提交到多个远程仓库(多看两个文档)
查看>>
期末大作业
查看>>
[Usaco2005 Open]Disease Manangement 疾病管理 BZOJ1688
查看>>
【Android视图效果】分组列表实现吸顶效果
查看>>
title: postGreSQL 插件 timescaleDB 安装使用 date: 2019-02-14 18:02:23
查看>>
并发容器与框架——并发容器(一)
查看>>
网络编程socket
查看>>
学界 | 伯克利最新研究:用算法解决算法偏差?公平机器学习的延迟影响
查看>>
多文件上传示例源码(默认支持各种类型,包括图片)
查看>>
JS 中如何判断 undefined 和 null
查看>>