最短路径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 ( ...
随机推荐
- Delphi IOS 上架
http://docwiki.embarcadero.com/RADStudio/Seattle/en/IOS_Mobile_Application_Development http://docwik ...
- ffmpeg设置avformat_open_input( )超时 -stimeout
ffmpeg用avformat_open_input()解析网络流时,默认是阻塞的. 当遇到解析错误的网络流时,会导致该函数长时间不返回. 为此可以设置ffmpeg的-stimeout 的参数,要注意 ...
- c# 通过dllimport 调用c 动态链接库
https://blog.csdn.net/zhunju0089/article/details/80906501 这篇文件很详细 讲述了如何创建c 动态链接库项目 有一些注意的地方 不做介绍 下面是 ...
- Bootstrap 学习资料
1.Bootstrap中文文档 2.Bootstrap3.1.1 DEMO 3.Bootstrap教程 4.Sco.js--Bootstrap javascript组件的增强版 如果,您认为阅读这篇博 ...
- Tornado之自定义session
面向对象基础 面向对象中通过索引的方式访问对象,需要内部实现 __getitem__ .__delitem__.__setitem__方法 #!/usr/bin/env python # -*- ...
- 数据预处理 center&scale&box-cox
http://stackoverflow.com/questions/33944129/python-library-for-data-scaling-centering-and-box-cox-tr ...
- Django框架 之 MTV模型、 基本命令、简单配置
浏览目录 MTV模型 Django框架前奏 Django基础必备三件套 Djaogo基本命令 MTV模型 Django的MTV分别代表: Model(模型):负责业务对象与数据库的对象(ORM) Te ...
- ubuntu扩展屏幕
1.了解设置的名称 直接运行xrandr(不带任何参数)就可以显示出当前的显示设备及设备的模式. xdj@xdj-Presario-CQ42-Notebook-PC:~$ xrandr Screen ...
- 清除Vs2010的工作区影射关系的缓存信息的文件夹路径
C:/Users/Administrator/AppData/Local/Microsoft/Team Foundation/3.0/Cache
- 如何处理与开发有争议的Bug?
工作中,测试人员有时会遇到类似的问题:提交了一份软件缺陷报告,可由于某种原因,无论是开发人员还是开发经理就是不愿修改程序.应如何处理这类问题呢?我认为,当对报告出现分歧意见后,测试工程师应首先做如下 ...