最短路径SPFA算法(邻接表存法)
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算法(邻接表存法)的更多相关文章
- POJ 1511 Invitation Cards (spfa的邻接表)
Invitation Cards Time Limit : 16000/8000ms (Java/Other) Memory Limit : 524288/262144K (Java/Other) ...
- 最短路径--SPFA 算法
适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了. 我们约定有向加权图G不存在负权回路,即最短路径一 ...
- 最短路径——SPFA算法
一.前提引入 我们学过了Bellman-Ford算法,现在又要提出这个SPFA算法,为什么呢? 考虑一个随机图(点和边随机生成),除了已确定最短路的顶点与尚未确定最短路的顶点之间的边,其它的边所做的都 ...
- 图的最短路径-----------SPFA算法详解(TjuOj2831_Wormholes)
这次整理了一下SPFA算法,首先相比Dijkstra算法,SPFA可以处理带有负权变的图.(个人认为原因是SPFA在进行松弛操作时可以对某一条边重复进行松弛,如果存在负权边,在多次松弛某边时可以更新该 ...
- hdu 1874 畅通工程(spfa 邻接矩阵 邻接表)
题目链接 畅通工程,可以用dijkstra算法实现. 听说spfa很好用,来水一发 邻接矩阵实现: #include <stdio.h> #include <algorithm> ...
- 最短路径----SPFA算法
求最短路径的算法有许多种,除了排序外,恐怕是ACM界中解决同一类问题算法最多的了.最熟悉的无疑是Dijkstra,接着是Bellman-Ford,它们都可以求出由一个源点向其他各点的最短路径:如果我们 ...
- poj1273--Drainage Ditches(最大流Edmond-Karp算法 邻接表实现)
最大流模板题 大部分Edmond-Karp算法代码都是邻接矩阵实现,试着改成了邻接表. #include <iostream> #include <cstdio> #inclu ...
- nyoj 239 月老的难题【匈牙利算法+邻接表】
月老的难题 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福 ...
- hdu 2444 The Accomodation of Students(二分匹配 匈牙利算法 邻接表实现)
The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
随机推荐
- 本博文将一步步带领你实现抽屉官网的各种功能:包括登陆、注册、发送邮箱验证码、登陆验证码、页面登陆验证、发布文章、上传图片、form验证、点赞、评论、文章分页处理以及基于tronado的后端和ajax的前端数据处理。
本博文将一步步带领你实现抽屉官网的各种功能:包括登陆.注册.发送邮箱验证码.登陆验证码.页面登陆验证.发布文章.上传图片.form验证.点赞.评论.文章分页处理以及基于tronado的后端和ajax的 ...
- SQLSERVER索引在什么情况下会失效
索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 注意:要想使用or,又想让索引生效,只能将or条件中的 ...
- 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! 简单来说, ...
- 面试题:jsp九大内置对象
我们常说的JSP有九大内置对象分别为:request.response.session.out.pagecontext.page.exception.application.config. 我们知道, ...
- Ubuntu 源使用帮助
地址 https://mirrors.ustc.edu.cn/ubuntu/ 说明 Ubuntu 软件源 收录架构 AMD64 (x86_64), Intel x86 其他架构请参考 Ubuntu P ...
- win32多线程 (四) Mutex
Mutex 用途和critical section 非常类似,不过Mutex是内核对象,速度比section慢.Mutexes可以跨进程使用.另外Mutex在等待的时候可以设置等待时间. 以下是两种 ...
- 实践作业3:白盒测试----简单介绍被测系统DAY4
本次被测软件是高校学生信息管理系统,和上次黑盒测试选用一样的系统,这样做的好处在于我们对系统比较熟悉,而且可以更好的比较黑盒测试与白盒测试的区别,采用MySQL Workbench 6.3,在MyEc ...
- 《the art of software testing》 第三章 人工测试
在深入研究较为传统的计算机测试技术之前,要先进行"人工测试". 代码检查与走查是两种主要的人工测试方法. 代码检查与走查是对过去桌面检查过程(在提交测试前由程序员阅读自己程序的过程 ...
- 编写高质量代码改善C#程序的157个建议——建议5: 使用int?来确保值类型也可以为null
建议5: 使用int?来确保值类型也可以为null 基元类型为什么需要为null?考虑两个场景: 1)数据库中一个int字段可以被设置为null.在C#中,值被取出来后,为了将它赋值给int类型,不得 ...
- 20169219 实验三 敏捷开发与XP实践 报告
实验内容 1.求命令行传入整数参数的和. package exp3; public class TestArgs01 { public static void main(String[] args) ...