最短路径:我的理解--SPFA算法
Algorithm。 最短路径快速算法-SPFA算法是西南交通大学段凡丁于1994年发表的。

因为SPFA没有向迪杰斯塔拉算法那样,寻找dist[]的最小值,所以重复入队,更新dis[]的最小值,因为这个点本身dis[]的变化,会影响到与之邻接的点,所以要重复入队。
int INF =
999999;
map[MAXN][MAXN];
//map[i,j]为初始输入的i到j的距离,未知的map[i,j]=INF;
dis[MAXN];//源点S到i的最短路
Q[MAXN];//队列
参数n表示结点数,s表示源点
int s)
i, pri, end, p, t;
// pri是队列头结点,end是队列尾结点
memset(vst,
0, sizeof(vst));//初始化
for(int
i=0; i<</b>MAXN; ++i)
Q[i] =
0;//初始化队列为空
for (i=0; i<</b>n; i++)
dis[i] =
INF;//初始化源点到I的值为最大值
dis[s] =
0;//源点为0
vst[s] =
1;//标记为已入队
s;//源点入队
= 1;//队首队尾赋值
while (pri
<</b> end)
{
p = Q[pri];//取队首元素
for (i=0; i<</b>n; ++i)
//更新dis
{ if (dis[p]+map[p][i] <</b> dis[i])
{
dis[i] =
dis[p]+map[p][i];
if (!vst[i])
//未在队列中
{
Q[end++]
= i;
vst[i] =
1;
}
}
}
vst[p] =
0; //
置出队的点为未标记
pri++;
}
return 1;
初始结点s,即为起点,若目标结点t,则输出dict[t]。
init_data(s);
int head = 0, tail = 1;
int path[Max]; //
可增加一个path[]数组来记录最后s到t的路径。
= s; //que.push(s);
dict[s] = 0;
while (tail >
head)//(!que.empty())
int u = queue[head];//int
u=que.front();
//que.pop();
vis[u] = true;
for (i = 1; i <= n; i ++)
{ if (dict[i] > dict[u] +
edge[u][i])
{ dict[i] = dict[u] +
edge[u][i];
path[i] = u;
num[i]++
if(num[i]>=n) return 1;//判断是否有负权值……
if (!vis[i])
// 对以前没有访问过的顶点,加入队列中。
{ vis[i] = true;
queue[tail] = i;// que.push(i);
tail
++;
}
}
}
vis[u] = false; //
记得把出队列的顶点的vis[]置为false。
head ++;
}
num[i]>=n的原因,即使所有的点更新都会让i入队的话,才只有n-1次,这时一定是最小值了,入队n次,一定有负权回路
最短路径:我的理解--SPFA算法的更多相关文章
- SPFA算法——最短路径
粗略讲讲SPFA算法的原理,SPFA算法是1994年西南交通大学段凡丁提出 是一种求单源最短路的算法 算法中需要用到的主要变量 int n; //表示n个点,从1到n标号 int s,t; //s ...
- 【算法】单元最短路径之Bellman-Ford算法和SPFA算法
SPFA是经过对列优化的bellman-Ford算法,因此,在学习SPFA算法之前,先学习下bellman-Ford算法. bellman-Ford算法是一种通过松弛操作计算最短路的算法. 适用条件 ...
- (转)SPFA算法
原文地址:http://www.cnblogs.com/scau20110726/archive/2012/11/18/2776124.html 粗略讲讲SPFA算法的原理,SPFA算法是1994年西 ...
- SPFA 算法(剪辑)(学习!)
SPFA算法 单源最短路径的算法最常用的是Dijkstra,些算法从时间复杂度来说为O(n^2),但是面对含有负权植的图来说就无能为力了,此时 Dellman-ford算法就有用了,这咱算法是采用的是 ...
- 转载:SPFA算法学习
转载地址:http://www.cnblogs.com/scau20110726/archive/2012/11/18/2776124.html 粗略讲讲SPFA算法的原理,SPFA算法是1994年西 ...
- 数据结构与算法--最短路径之Bellman算法、SPFA算法
数据结构与算法--最短路径之Bellman算法.SPFA算法 除了Floyd算法,另外一个使用广泛且可以处理负权边的是Bellman-Ford算法. Bellman-Ford算法 假设某个图有V个顶点 ...
- (最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法模板的整理与介绍
这一篇博客以一些OJ上的题目为载体.整理一下最短路径算法.会陆续的更新... 一.多源最短路算法--floyd算法 floyd算法主要用于求随意两点间的最短路径.也成最短最短路径问题. 核心代码: / ...
- 最短路径问题的Dijkstra和SPFA算法总结
Dijkstra算法: 解决带非负权重图的单元最短路径问题.时间复杂度为O(V*V+E) 算法精髓:维持一组节点集合S,从源节点到该集合中的点的最短路径已被找到,算法重复从剩余的节点集V-S中选择最短 ...
- 最短路径--SPFA 算法
适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了. 我们约定有向加权图G不存在负权回路,即最短路径一 ...
随机推荐
- JS设计模式——4.继承(概念)
类式继承 0.构造函数 一个简单的Person类 function Person(name){ this.name = name; } Person.prototype.getName = funct ...
- Android Service使用简单介绍
作为一个android初学者,经常对service的使用感到困惑.今天结合Google API 对Service这四大组件之一,进行简单使用说明. 希望对和我一样的初学者有帮助,如有不对的地方,也希望 ...
- 1-spring xml 和 注解 解析过程
spring mvc 入口 DispatcherServlet,类关系图如下所示 DispatcherServlet 就是一个 Servlet,那Servlet 的初始化方法 init()在哪里,通过 ...
- PHP 快速建立一个对象
前言 PHP 中的数组(尤其关联数组)是经常使用的 —— 因为方便.在一些框架中也经常见到返回数组格式的配置参数.然而有些时候可能需要对象而非数组类型的配置参数,在查阅网络资料后找到了方法,作以记录. ...
- 多播知识by 陈胜君
简单的讲一下多拨的说明:一.多拨分物理多拨和虚拟多拨. 物理多拨是电信老套餐,就是一个宽带支持四个内网设备同时拨号上网,即2004年以前,允许家里四台电脑直接连LAN网口启动拨号,同时允许四拨在线.现 ...
- leetcode 之Permutation(七)
首先是next permutation的算法的描述和分析如下: 这题一是要知道思路,编程中注意STL的用法 void nextPermutaion(vector<int> &num ...
- Ubuntu下Hadoop的安装和配置
最近又需要要搭hadoop环境,所以开始学习,下面是我的笔记,仅供大家参考! Hadoop安装: JDK1.6+ 操作系统:Linux,Window和Unix也可以做Hadoop的开发,只有Linux ...
- Python解释器【转载】
原文链接 0x01 简介 当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件.要运行代码,就需要Python解释器去执行.py文件. 0x02 Python ...
- Templated Helper Methods
1.Model 2.HomeController 3.CreatePerson.cshtml 禁用了客户端验证 4.Using Templated Helper Methods Editor 和 Ed ...
- bzoj 1123 tarjan求割点
#include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk mak ...