Spfa算法 (模板源代码)
2011-09-16 15:59
148 查看
zz http://blog.sina.com.cn/s/blog_6ad20aef0100mc1a.html
Spfa算法 (模板源代码)
这是Bellman Ford的改进算法。
算法介绍:建立一个队列,初始时队列里只有起始点,在建立一个表格记录起始点到所有点的最短路径(该表格的初始值要赋为极大值,该点到他本身的路径赋为0)。然后执行松弛操作,用队列里有的点去刷新起始点到所有点的最短路,如果刷新成功且被刷新点不在队列中则把该点加入到队列最后。重复执行直到队列为空。
时间复杂度:期望的时间复杂度O(ke), 其中k为所有顶点进队的平均次数,可以证明k一般小于等于2。
通用模板设计(源代码):
先说明一下,g所求有向图(g[i][j]为i到j的边长度,如果g[i][j]不存在,则赋值为-1),Q为队列,dis中所有元素应初始化为inf(0xfffffff最大值),visit中所有元素应初始化为false。
void spfa(int s,int m)
{
int i,k,ts=0,te=1;
Q[ts] = s;
dis[s] = 0;
while(ts<te)
{
k = Q[ts];
visit[k]=false; //修改后增加的 2010.8.18 01:27
for(i=1;i<=m;i++)
{
if(g[k][i]>0 && dis[i] - g[k][i] > dis[k])
{
dis[i] = dis[k] + g[k][i];
if(!visit[i])
{
Q[te++] = i;
visit[i] = true;
}
}
}
ts++;
}
}
其中,得到的dis数组dis[i]就是的源点s到点i的最短路径长度。
值得一提的是,当所求图的点很多时,用二维数组来储存图可能会MLE,这就需要用邻接表或者邻接矩阵来储存图了,只要将该模板稍改一下,就可以用了。不过,学会该算法的思想是最重要的了!
Spfa算法 (模板源代码)
这是Bellman Ford的改进算法。
算法介绍:建立一个队列,初始时队列里只有起始点,在建立一个表格记录起始点到所有点的最短路径(该表格的初始值要赋为极大值,该点到他本身的路径赋为0)。然后执行松弛操作,用队列里有的点去刷新起始点到所有点的最短路,如果刷新成功且被刷新点不在队列中则把该点加入到队列最后。重复执行直到队列为空。
时间复杂度:期望的时间复杂度O(ke), 其中k为所有顶点进队的平均次数,可以证明k一般小于等于2。
通用模板设计(源代码):
先说明一下,g所求有向图(g[i][j]为i到j的边长度,如果g[i][j]不存在,则赋值为-1),Q为队列,dis中所有元素应初始化为inf(0xfffffff最大值),visit中所有元素应初始化为false。
void spfa(int s,int m)
{
int i,k,ts=0,te=1;
Q[ts] = s;
dis[s] = 0;
while(ts<te)
{
k = Q[ts];
visit[k]=false; //修改后增加的 2010.8.18 01:27
for(i=1;i<=m;i++)
{
if(g[k][i]>0 && dis[i] - g[k][i] > dis[k])
{
dis[i] = dis[k] + g[k][i];
if(!visit[i])
{
Q[te++] = i;
visit[i] = true;
}
}
}
ts++;
}
}
其中,得到的dis数组dis[i]就是的源点s到点i的最短路径长度。
值得一提的是,当所求图的点很多时,用二维数组来储存图可能会MLE,这就需要用邻接表或者邻接矩阵来储存图了,只要将该模板稍改一下,就可以用了。不过,学会该算法的思想是最重要的了!
相关文章推荐
- Spfa算法 (模板源代码)
- Spfa算法 (模板源代码)
- 图论求单源最短路 spfa算法(附模板)
- SPFA算法模板例题[POJ1062]-昂贵的聘礼
- Eclipse添加源代码的注释模板
- 实用:源代码注释模板
- 参考:模板数组源代码
- 视频图片类APP模板出售(可含源代码)
- 标准的基于欧式距离的模板匹配算法优源码化和实现(附源代码)。
- 模板匹配及其源代码---Edge Based Template Matching
- UVA 10000 Longest Paths (SPFA算法,模板题)
- 最短路——SPFA算法模板
- sql插入删除模板源代码
- Spfa算法模板
- SPFA算法模板(邻接阵)
- 分享一个非常好用的Worker池——缓冲区和侦听模板(Java、提供源代码下载)
- SPFA算法模板
- ios basics 0.0:新建一个空模板应用文件,学习empty application 中的源代码作用
- SPFA算法模板(实际上是bellman-ford) 的队列优化
- Discuz的模板制作与源代码分析