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没有在队列中,那么要将点v入队(记得标记);

    4>如果已经在队列中了,那么就不用入队

    以此循环,直到队空为止就完成了单源最短路的求解

void SPFA(int s,int t)//s是源点,t是终点
{
    int i,j,top,front,rear;
    for(i=1;i<=n;i++)
        dist[i]=INF;//初始化
    memset(vis,0,sizeof(vis));
    dist[s]=0;//源点路径为0
    vis[s]=1;//访问过
    front=rear=0;
    q[rear++]=s;//没有前驱
    while(front<rear)
    {
        top=q[front++];
        vis[top]=0;
        for(i=first[top];i!=-1;i=edge[i].next)
        {
            j=edge1[i].to;
            if(dist[j]>dist[top]+edge[i].w)//松弛
            {
                dist[j]=dist[top]+edge[i].w;
                if(!vis[j])
                {
                    vis[j]=1;
                    q[rear++]=j;
                }
            }
        }
    }
}
时间: 2024-10-05 05:20:37

SPFA算法-单源最短路径算法的相关文章

数据结构与算法--单源最短路径算法之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

单源最短路径算法---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

带负权图的单源最短路径算法:Bellman-Ford算法

算法简介 前面介绍过图的单源最短路径算法Dijkstra算法,然而Dijkstra算法无法判断含负权边的图的最短路.如果遇到负权,在没有负权回路存在时(负权回路的含义是,回路的权值和为负.)即便有负权的边,也可以采用Bellman-Ford算法正确求出最短路径. Bellman-Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题.对于给定的带权(有向或无向)图G=(V,E),其源点为s,加权函数 w是 边集 E 的映射.对图G运行Bellman-Ford算法的结果是一个布尔值,表

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 算法同为解决单源最短路径的算法.对于带权有向

Dijkstra 单源最短路径算法

Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年构思并于 1959 年发表.其解决的问题是:给定图 G 和源顶点 v,找到从 v 至图中所有顶点的最短路径. Dijkstra 算法采用贪心算法(Greedy Algorithm)范式进行设计.在最短路径问题中,对于带权有向图 G = (V, E),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算法详细(单源最短路径算法)

介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或许,你曾经感觉它很难,那么,这个时候正适合你重新认识它. Dijkstra能是干啥的? Dijkstra是用来求单源最短路径的 就拿上图来说,假如直到的路径和长度已知,那么可以使用dijkstra算法计算南京到图中所有节点的最短距离. 单源什么意思? 从一个顶点出发,Dijkstra算法只能求一个顶

单源最短路径算法的MapReduce实现(Metis版本)

1. Mapreduce框架 1.1 Mapreduce介绍 Mapreduce 是谷歌提出的一个分布式计算框架, 利用该框架, 能够让用户方便地利用多机并行处理数据. 该框架有两个重要的函数: Map 和 Reduce, Map 函数对整个输入数据进行处理, 按照用户定义的处理方式, 从输入的数据中产生中间键值对( key, value).Reduce 函数对这些键值对进行处理, 相同 key 的键值对由同一个 Reduce 进程进行处理.最终将处理的结果进行合并. 整个处理流程如下: 1.2

单源最短路径算法——Bellman-ford算法和Dijkstra算法

 BellMan-ford算法描述 1.初始化:将除源点外的所有顶点的最短距离估计值 dist[v] ← +∞, dist[s] ←0; 2.迭代求解:反复对边集E中的每条边进行松弛操作,使得顶点集V中的每个顶点v的最短距离估计值逐步逼近其最短距离:(运行|v|-1次) 3.检验负权回路:判断边集E中的每一条边的两个端点是否收敛.如果存在未收敛的顶点,则算法返回false,表明问题无解:否则算法返回true,并且从源点可达的顶点v的最短距离保存在 dist[v]中. 1 BELLMAN-FORD