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. 手机自带输入法emoji表情的输入,提交及显示——前端解决方案

    体验更优排版请移步原文:http://blog.kwin.wang/programming/emoji-transform-commit.html 之前就遇到过需要前端支持用户输入并提交emoji表情 ...

  2. 1.forEach():遍历数组,并为每个元素调用传入的函数; 举例:

    var a = [1,2,3]; var sum = 0; //传一个参数 a.forEach(function(v){ sum += v; }); console.log(sum);//6 //传三 ...

  3. mysql之提示符

    MySQL常用的简单的命令: mysql> PROMPT \u@\h \d> PROMPT set to '\u@\h \d>' root (none)>USE test Da ...

  4. 【原】Coursera—Andrew Ng机器学习—Week 3 习题—Logistic Regression 逻辑回归

    课上习题 [1]线性回归 Answer: D A 特征缩放不起作用,B for all 不对,C zero error不对 [2]概率 Answer:A [3]预测图形 Answer:A 5 - x1 ...

  5. C++中不可重载5个运算符

    C++中不可重载的5个运算符 C++中的大部分运算符都是可以重载的,只有以下5个运算符不可以重载,他们是: 1  .(点运算符)通常用于去对象的成员,但是->(箭头运算符),是可以重载的   2 ...

  6. openebula vm无法获取IP问题解决

    http://archives.opennebula.org/documentation:archives:rel2.2:cong Contextualizing Virtual Machines 2 ...

  7. CF 961G Partitions

    推不动式子 我们考虑每一个$w_i$对答案的贡献,因为题目中定义集合的价值为$W(S) = \left | S \right |\sum_{x \in S}w_x$,这个系数$\left | S \r ...

  8. seconds

    set_time_limit();//设置脚本运行时间为1秒

  9. 【原创】ListView快速滚动至新添加一行(自动滚动)

    在C#开发中我们经常要开发一些日志系统,尤其是基于ListView的日志显示系统.但是当日志增多是你是否有一些困扰,就是它为什么不会自动滚动至最后一行. 以下是一小段代码,希望可以帮助你. publi ...

  10. App常用性能测试工具清单

    APP的CPU,内存,耗电,流量测试工具 APP的CPU,内存,耗电,流量测试工具下载地址,后续文章会介绍如何使用Emmagee.itest.gt APP应用的CPU,内存,耗电,流量调查(可和同类产 ...