邻接表(spfa算法---单源最短路)

原创 2015年05月31日 10:01:21
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string.h>
#include <queue>
#include <vector>
#define inf 0x3fffffff                     
#define N 10010
using namespace std;        //使用邻接表hdu2544  (spfa算法----单源最短路)
int pre[210], dis[210], n, m, vis[210], s, e;  //pre[x]记录的是起点为x的链表之首在数组p的位置(相当于头插法)
queue<int> q;
/*
spfa算法做法(百度):
我们用数组d记录每个结点的最短路径估计值,而且用邻接表来存储图G。
我们采取的方法是动态逼近法:设立一个先进先出的队列用来保存待优化的结点,
优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,
如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作,直至队列空为止。
*/
struct Edge
{
    int v; //表示边的终点
    int w; //边的权值
    int next;  //同一个起点的上一个边在数组p里的位置
}p[N];   //注意这里是边的数目
void init()  //初始化邻接表
{
    int t, j, a, b, c, index=0, flag;   //index表示序号
    memset(pre, -1, sizeof(pre));
    for(t=0; t<m; ++t)
    {
        scanf("%d%d%d", &a, &b, &c);
        p[index].v=b;
        p[index].w=c;
        p[index].next=pre[a];
        pre[a]=index;
        index++;
        p[index].v=a;   //路是双向的
        p[index].w=c;
        p[index].next=pre[b];
        pre[b]=index;
        index++;
    }
    return ;
}
void spfa()
{
    int t, g, j;   //起点为1, 终点为end
    s=1;
    e=n;
    for(t=1; t<=n; ++t)
        dis[t]=inf;
    dis[s]=0;
    while(!q.empty())
    {
        q.pop();
    }
    q.push(s);
	vis[s]=1;
    while(!q.empty())
    {
        g=q.front();
        q.pop();
        vis[g]=0;
        for(j=pre[g]; j!=-1; j=p[j].next)
        {
            if(dis[p[j].v]>p[j].w+dis[g])     //最短路径估计值有所改变
            {
                dis[p[j].v]=p[j].w+dis[g];
                if(!vis[p[j].v])      //该节点v不在序列中
               {
                    vis[p[j].v]=1;
                    q.push(p[j].v);
                }
            }
        }
    }
    return ;
}

int main()
{
    while(scanf("%d%d", &n, &m)!=EOF)
    {
        if(n==0&&m==0)break;
        init();  //初始化
        spfa();
        printf("%d\n", dis[n]);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

最短路算法详解(Dijkstra/SPFA/Floyd)

常用的图论最短路算法详解(dijkstra/SPFA/floyd)
  • murmured
  • murmured
  • 2014年02月16日 13:08
  • 2599

bfs和spfa最短路算法的区别,细节

SPFA  在形式上和BFS非常类似,不同的是BFS中一个点出了队列就不可能重新进入队列,但是SPFA中 一个点可能在出队列之后再次被放入队列,也就是一个点改进过其它的点之后,过了一段时间可能本 身被...
  • u010126535
  • u010126535
  • 2013年12月01日 21:46
  • 752

谈宽搜SPFA算法和深搜优化SPFA

SPFA算法是最短路的万能算法。 本文就宽搜和深搜的两种写法来谈,深搜优化主要解决优化判负环的速度。值得一看!...
  • xuechen_gemgirl
  • xuechen_gemgirl
  • 2017年07月25日 00:59
  • 252

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

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

最短路之 路径记录 dijkstra + floyd + SPFA 【小笔记】

引子:我们在求解最短路的时候,有的时候需要输出路径,这里就介绍下路径记录及输出的一些方法。 为了更好理解,提出一个问题: 给出n个车站,m条单向路线以及 每条路线的信息即 起点终点和对应的花费(n...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2015年06月28日 11:56
  • 1708

nyoj1006(最短路次短路spfa)

偷西瓜 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 对于农村的孩子来说最大的乐趣,莫过于和小伙伴们一块下地偷西瓜了,虽然孩子们条件不是...
  • y990041769
  • y990041769
  • 2014年05月10日 15:51
  • 2010

SPFA 最短路 带负权边的---- 粗了解

SPFA(Shortest Path Faster Algorithm)是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算。 算法大致流程是用一个队列来进行维护。 初始时将源加...
  • WR_technology
  • WR_technology
  • 2016年04月26日 21:28
  • 1556

最短路算法详解(Dijkstra/SPFA/Floyd)

转自:http://blog.csdn.net/murmured/article/details/19281031 一、Dijkstra Dijkstra单源最短路算法,即计算从起点出发到每个...
  • acm_1361677193
  • acm_1361677193
  • 2015年09月04日 18:23
  • 3538

hdu2544 最短路之spfa算法+链式前向星建图

http://acm.hdu.edu.cn/showproblem.php?pid=2544
  • u013573047
  • u013573047
  • 2014年04月06日 17:15
  • 1074

最短路(SPFA)

算法特点(权值可正可负,判断负环) 1.用来求解单源最短路径,源点到任意点的最短路。 2.算法介绍:建立一个队列q,初始时队列里只有一个起始点,在建立一个数组dis记录起始点到所有点的最短路径,并...
  • booyoungxu
  • booyoungxu
  • 2015年07月28日 21:00
  • 257
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:邻接表(spfa算法---单源最短路)
举报原因:
原因补充:

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