queue <int> Q;
void SPFA (int s)
{
int i, v;
for(int i=0; i<=n; i++)
dist[i]=INF; //初始化每点i到s的距离 dist[s] = 0;
visit[s] = true;
Q.push(s); //队列初始化,s为起点 while ( !Q.empty() ) //队列非空
{
v=Q.front();
Q.pop(); //取队首元素
visit[v]=false; //释放队首结点,因为这节点可能下次用来松弛其它节点,重新入队 for(i=0; i<=n; i++) //对所有顶点
if ( g[v][i] > 0 && dist[i] > dist[v] + g[v][i] )
{
dist[i] = dist[v] + g[v][i]; //修改最短路
if ( visit[i] == false ) //如果扩展结点i不在队列中,入队
{
Q.push(i);
visit[i] = true;
}
} }
}

图的邻接表表示可以看这篇博客,尤其理解next数组作用;

#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#define oo 0x3fffffff
using namespace std;
const int N = 10005, M = 200005; //N表示最大点的个数 ,M表示最大边的个数 struct Edge
{
int to;
int wei;
int next; //邻接链表的套路,to邻接顶点,wei表边的权重,next表链表指针
}; Edge edge[M]; //储存边的信息
int head[N], k, dist[N]; //dist【i】表示起点到 i的最短距离
bool visit[N];
queue<int> Q; void Addedge(int x,int y,int c) //存图 ,x到y有一条权重为c的边
{
edge[k].to=y;
edge[k].wei=c;
edge[k].next=head[x];
head[x]=k++; } void Init( int n, int m )
{
int x, y, c;
memset( head, -1, sizeof(head) ); //清零,作为每个点dfs的终止标志
fill( visit, visit+n+1, false); //一开始都不在队列中
while ( m-- )
{
cin >> x >> y >> c;
Addedge( x, y, c );
Addedge( y, x, c );
}
fill( dist, dist+n+1, oo ); //先初始化为无穷大
} void Spfa( int s ) //这是套路
{
Q.push(s);
dist[s]=0;
visit[s]=true;
while ( !Q.empty() )
{
int v = Q.front();
Q.pop();
visit[v] = false; for (int i = head[v]; i != -1; i = edge[i].next)
{ //遍历整张图
int w = edge[i].to;
if (dist[w] > dist[v] + edge[i].wei) //如果到v的距离大于到u再加上u到v的距离,就更新
{
dist[w] = dist[v] + edge[i].wei;
if (visit[w] != true)
{
Q.push(w);
visit[w]=true; //指标记,防止重复进入,否则队列没有意义
}
}
} } } void Output( int n )
{
cout << dist[n] << endl; //输出到终点的距离就行了,其实你想输出到哪点的最短距离都可以
} int main()
{
int n, m, s;
while( cin >> n >> m )
{
Init( n, m ); //输入存图
s = 1; //起点
Spfa( s ); //算法核心
Output( n ); //输出答案
}
return 0;
}

最短路径SPFA算法(邻接表存法)的更多相关文章

  1. POJ 1511 Invitation Cards (spfa的邻接表)

    Invitation Cards Time Limit : 16000/8000ms (Java/Other)   Memory Limit : 524288/262144K (Java/Other) ...

  2. 最短路径--SPFA 算法

    适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了. 我们约定有向加权图G不存在负权回路,即最短路径一 ...

  3. 最短路径——SPFA算法

    一.前提引入 我们学过了Bellman-Ford算法,现在又要提出这个SPFA算法,为什么呢? 考虑一个随机图(点和边随机生成),除了已确定最短路的顶点与尚未确定最短路的顶点之间的边,其它的边所做的都 ...

  4. 图的最短路径-----------SPFA算法详解(TjuOj2831_Wormholes)

    这次整理了一下SPFA算法,首先相比Dijkstra算法,SPFA可以处理带有负权变的图.(个人认为原因是SPFA在进行松弛操作时可以对某一条边重复进行松弛,如果存在负权边,在多次松弛某边时可以更新该 ...

  5. hdu 1874 畅通工程(spfa 邻接矩阵 邻接表)

    题目链接 畅通工程,可以用dijkstra算法实现. 听说spfa很好用,来水一发 邻接矩阵实现: #include <stdio.h> #include <algorithm> ...

  6. 最短路径----SPFA算法

    求最短路径的算法有许多种,除了排序外,恐怕是ACM界中解决同一类问题算法最多的了.最熟悉的无疑是Dijkstra,接着是Bellman-Ford,它们都可以求出由一个源点向其他各点的最短路径:如果我们 ...

  7. poj1273--Drainage Ditches(最大流Edmond-Karp算法 邻接表实现)

    最大流模板题 大部分Edmond-Karp算法代码都是邻接矩阵实现,试着改成了邻接表. #include <iostream> #include <cstdio> #inclu ...

  8. nyoj 239 月老的难题【匈牙利算法+邻接表】

    月老的难题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福 ...

  9. hdu 2444 The Accomodation of Students(二分匹配 匈牙利算法 邻接表实现)

    The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

随机推荐

  1. 本博文将一步步带领你实现抽屉官网的各种功能:包括登陆、注册、发送邮箱验证码、登陆验证码、页面登陆验证、发布文章、上传图片、form验证、点赞、评论、文章分页处理以及基于tronado的后端和ajax的前端数据处理。

    本博文将一步步带领你实现抽屉官网的各种功能:包括登陆.注册.发送邮箱验证码.登陆验证码.页面登陆验证.发布文章.上传图片.form验证.点赞.评论.文章分页处理以及基于tronado的后端和ajax的 ...

  2. SQLSERVER索引在什么情况下会失效

    索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 注意:要想使用or,又想让索引生效,只能将or条件中的 ...

  3. Ubuntu无法安装rpm包,ubuntu RPM should not be used directly install RPM packages, use Alien instead!

    Ubuntu无法安装rpm包,ubuntu RPM should not be used directly install RPM packages, use Alien instead! 简单来说, ...

  4. 面试题:jsp九大内置对象

    我们常说的JSP有九大内置对象分别为:request.response.session.out.pagecontext.page.exception.application.config. 我们知道, ...

  5. Ubuntu 源使用帮助

    地址 https://mirrors.ustc.edu.cn/ubuntu/ 说明 Ubuntu 软件源 收录架构 AMD64 (x86_64), Intel x86 其他架构请参考 Ubuntu P ...

  6. win32多线程 (四) Mutex

    Mutex 用途和critical  section 非常类似,不过Mutex是内核对象,速度比section慢.Mutexes可以跨进程使用.另外Mutex在等待的时候可以设置等待时间. 以下是两种 ...

  7. 实践作业3:白盒测试----简单介绍被测系统DAY4

    本次被测软件是高校学生信息管理系统,和上次黑盒测试选用一样的系统,这样做的好处在于我们对系统比较熟悉,而且可以更好的比较黑盒测试与白盒测试的区别,采用MySQL Workbench 6.3,在MyEc ...

  8. 《the art of software testing》 第三章 人工测试

    在深入研究较为传统的计算机测试技术之前,要先进行"人工测试". 代码检查与走查是两种主要的人工测试方法. 代码检查与走查是对过去桌面检查过程(在提交测试前由程序员阅读自己程序的过程 ...

  9. 编写高质量代码改善C#程序的157个建议——建议5: 使用int?来确保值类型也可以为null

    建议5: 使用int?来确保值类型也可以为null 基元类型为什么需要为null?考虑两个场景: 1)数据库中一个int字段可以被设置为null.在C#中,值被取出来后,为了将它赋值给int类型,不得 ...

  10. 20169219 实验三 敏捷开发与XP实践 报告

    实验内容 1.求命令行传入整数参数的和. package exp3; public class TestArgs01 { public static void main(String[] args) ...