Ford算法(单源最短路径)

优点:代码较少,复杂度不高,可以判断是否会有负环。

缺点:效率低。

算法阐述:

这个算法的思想非常简单,首先它是根据从起点向与它相连的线段开始刷新,只要满足刷新后的路径比原有路径小的话,那么就立即更新这个数据,是这个数据作为新的数

据。同时这个算法有一个很重要的优势,那就是可以判断有没有负环的存在。

负环判断原理:

这个算法的代码我在下面会有一个代码的描述,这个算法是通过一个整体的更新来实现查找最短的路径,那么这里面就有一个关于这个算法的更新次数的问题,首先一个确定

下来的顶点它向它周围进行一个更新是否会更新出至少一个顶点呢?答案: 是的,如果一个确定的顶点是一定可以更新出另一个确定的顶点的,这里说的确定的顶点就是 这个顶点

有了一个确定的路径的。比如:A->Z 这里面A为起点,如果A起点不能确定与它相连的顶点没有一条为最短的点,那么这个A->Z也就无解了,关于这个问题我就不再阐述了。

代码:

#include <iostream>
#include<cstdio>
using namespace std;
typedef struct Line{
    int first;
    int last;
    int length;
}L;
L a[50];
int d[50];
int main()
{
    int n,m,temp;//n为边数,m为顶点数
    scanf("%d%d",&n,&m);
    fill(d,d+50,8888888);//先将d全部赋值为8888888,这是让他们先当做我还没有定值的顶点!
    d[1]=0;//起点置为0
    for(int i=0;i<n;i++)scanf("%d%d%d",&a[i].first,&a[i].last,&a[i].length);
    for(int i=1;i<=m;i++)
    {
        temp=1;//用这个变量来判断这个环是否都是最短路径了!
        for(int j=0;j<n;j++)
        {
            if(d[a[j].last]>d[a[j].first]+a[j].length)//判断标准
            {
                d[a[j].last]=d[a[j].first]+a[j].length;
                temp=0;
                if(i==m){//上文已经有了一个解释
                    printf("出现了负环!!!!");
                    return -1;
                }
            }
        }
        if(temp){
            break;
        }
    }
    for(int i=1;i<=m;i++)
    {
        printf("%d\n",d[i]);
    }
}
时间: 2024-08-27 09:11:25

Ford算法(单源最短路径)的相关文章

数据结构与算法--单源最短路径算法之dijkstra

单源最短路径之dijkstra算法 最优子问题:dis(s,...,e)是s到e的最短路径,在这条路径上的所有点之间dis(pi,pj)距离是最小的. 算法思路: 首先初始化,dis[s][i]是s到i的距离,直接相连的就是其距离,不直接相连的就是无穷大 下面是算法主要模块: 1.选取dis[i]最小的点加入到P{S}中, 2.计算是否更新dis[j],j是和i直接相连的 3.重复以上步骤,直到e

SPFA算法-单源最短路径算法

1.介绍: SPFA算法:单源最短路径算法,一种高效的最短路径算法! 2.思路 (1)初始化 1>源点路径为0  :d[s]=0 ,其中s为源点 2>初始化d[N]为无穷大,即d[i]表示,源点s到i为无穷大INF 3>p[N]初始化为源点s或-1,表示没有前驱 (2)队列+松弛 1>读取队头顶点u,并将队头顶点u出队(记得消除标记): 2>将与点u相连的所有点v进行松弛操作,如果能更新估计值(即令d[v]变小),那么就更新; 3>另外,如果点v没有在队列中,那么要将点

(转)迪杰斯特拉算法 单源最短路径 权重为非负

转自:http://blog.163.com/cindy_19810217/blog/static/20105911820131019114612133/

数据结构:单源最短路径--Dijkstra算法

Dijkstra算法 单源最短路径 给定一带权图,图中每条边的权值是非负的,代表着两顶点之间的距离.指定图中的一顶点为源点,找出源点到其它顶点的最短路径和其长度的问题,即是单源最短路径问题. Dijkstra算法 求解单源最短路径问题的常用方法是Dijkstra(迪杰斯特拉)算法.该算法使用的是贪心策略:每次都找出剩余顶点中与源点距离最近的一个顶点. 算法思想 带权图G=<V,E>,令S为已确定了最短路径顶点的集合,则可用V-S表示剩余未确定最短路径顶点的集合.假设V0是源点,则初始 S={V

Bellman-Ford 单源最短路径算法

Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法.该算法由 Richard Bellman 和 Lester Ford 分别发表于 1958 年和 1956 年,而实际上 Edward F. Moore 也在 1957 年发布了相同的算法,因此,此算法也常被称为 Bellman-Ford-Moore 算法. Bellman-Ford 算法和 Dijkstra 算法同为解决单源最短路径的算法.对于带权有向

单源最短路径算法

目录 基本性质 Bellman Ford算法 spfa(Shortest Path Faster Algorithm) 算法 Dijkstra 算法 例题练习 主要参考算法导论 基本性质 使用min_w(s,v)表示源节点s到v的最短路径长度: w(u,v)表示节点u到v的权重: u.d表示源节点s到节点u的当前路径长度: 松弛操作 relax(u,v,w) { if(u.d + w < v.d) { v.d = u.d + w; } } 三角不等式 min_w(s,v) <= min_w(s

Dijkstra算法求单源最短路径

1.最短路径 在一个连通图中,从一个顶点到另一个顶点间可能存在多条路径,而每条路径的边数并不一定相同.如果是一个带权图,那么路径长度为路径上各边的权值的总和.两个顶点间路径长度最短的那条路径称为两个顶点间的最短路径,其路径长度称为最短路径长度. 最短路径在实际中有重要的应用价值.如用顶点表示城市,边表示两城市之间的道路,边上的权值表示两城市之间的距离.那么城市A到城市B连通的情况下,哪条路径距离最短呢,这样的问题可以归结为最短路径问题. 求最短路径常见的算法有Dijkstra算法和Floyd算法

单源最短路径 dijkstra算法实现

本文记录一下dijkstra算法的实现,图用邻接矩阵表示,假设图为无向图,并且连通,有向图,不连通图的做法类似. 算法简述: 首先确定"单源"的源,假设是第0个顶点. 维护三个数组dist[], color[], path[],设其下标分别为0-i-n-1: dist[] 表示源点到顶点i的最短距离,在初始化时,如果源点到顶点i有路径,则初始化为路径的权重,否则初始化为INT_MAX: color[] 数组其实表示两个集合,即color[i]值为1的集合表示已经确定最短路径的点的集合,

数据结构之单源最短路径(迪杰斯特拉算法)-(九)

最开始接触最短路径是在数据结构中图的那个章节中.运用到实际中就是我在大三参加的一次美赛中,解决中国的水资源问题.所谓单源最短路径,就是一个起点到图中其他节点的最短路径,这是一个贪心算法. 迪杰斯特拉算法原理(百科): 按路径长度递增次序产生算法: 把顶点集合V分成两组: (1)S:已求出的顶点的集合(初始时只含有源点V0) (2)V-S=T:尚未确定的顶点集合 将T中顶点按递增的次序加入到S中,保证: (1)从源点V0到S中其他各顶点的长度都不大于从V0到T中任何顶点的最短路径长度 (2)每个顶

单源最短路径算法---Dijkstra

Dijkstra算法树解决有向图G=(V,E)上带权的单源最短路径问题,但是要求所有边的权值非负. 解题思路: V表示有向图的所有顶点集合,S表示那么一些顶点结合,从源点s到该集合中的顶点的最终最短路径的权值(程序中用dist[i]表示)已经确定.算法反复选择具有最短路径估计的顶点u 属于 V-S(即未确定最短路径的点,程序中finish[i]=false的点),并将u加入到S中(用finish[i]=true表示),最后对u的所有输出边进行松弛. 程序实现:      输入数据: 5 7 0