Spfa算法 (模板源代码)
来源:互联网 发布:android记账软件源码 编辑:程序博客网 时间:2024/06/05 02:11
Spfa算法 (模板源代码)
这是Bellman Ford的改进算法。算法介绍:建立一个队列,初始时队列里只有起始点。具体做法是用一个队列保存待松弛的点,然后对于每个出队 的点依次遍历每个与他有边相邻的点(用邻接表效率较高),如果该点可以松弛并且队列中没有该点则将它加入队 列中,如此迭代直到队列为空。
时间复杂度:期望的时间复杂度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的最短路径长度。
若要判负环路,则记录一个点的入队次数,若超过边数,则有负权环。
邻接表实现:
#include <iostream>#include <queue>using namespace std;const long MAXN=10000;const long lmax=0x7FFFFFFF;typedef struct { long v; long next; long cost;}Edge;Edge e[MAXN];long p[MAXN];long Dis[MAXN];bool vist[MAXN];queue<long> q;long m,n;//点,边void init(){ long i; long eid=0; memset(vist,0,sizeof(vist)); memset(p,-1,sizeof(p)); fill(Dis,Dis+MAXN,lmax); while (!q.empty()) { q.pop(); } for (i=0;i<n;++i) { long from,to,cost; scanf("%ld %ld %ld",&from,&to,&cost); e[eid].next=p[from]; e[eid].v=to; e[eid].cost=cost; p[from]=eid++; //以下适用于无向图 swap(from,to); e[eid].next=p[from]; e[eid].v=to; e[eid].cost=cost; p[from]=eid++; }}void print(long End){ //若为lmax 则不可达 printf("%ld\n",Dis[End]); }void SPF(){ init(); long Start,End; scanf("%ld %ld",&Start,&End); Dis[Start]=0; vist[Start]=true; q.push(Start); while (!q.empty()) { long t=q.front(); q.pop(); vist[t]=false; long j; for (j=p[t];j!=-1;j=e[j].next) { long w=e[j].cost; if (w+Dis[t]<Dis[e[j].v]) { Dis[e[j].v]=w+Dis[t]; if (!vist[e[j].v]) { vist[e[j].v]=true; q.push(e[j].v); } } } } print(End);}int main(){ while (scanf("%ld %ld",&m,&n)!=EOF) { SPF(); } return 0;}
0 0
- Spfa算法 (模板源代码)
- Spfa算法 (模板源代码)
- 图论求单源最短路 spfa算法(附模板)
- spfa算法(洛谷模板题)
- 基础SPFA算法模板
- SPFA算法模板
- SPFA算法模板
- SPFA算法模板
- spfa 算法模板
- SPFA算法模板
- SPFA算法模板
- spfa算法模板
- Spfa算法模板
- hihocoder1093 SPFA算法模板
- SPFA算法模板
- SPFA算法模板
- hdu 2544 spfa算法模板
- 最短路【SPFA】算法模板
- uiautomator中AccessibilityNodeInfoDumper学习笔记(7)
- [Leetcode]Word Break & Word Break II
- Unauthorized request to start container
- 什么是僵尸进程(zombie)?
- POI导出到Excel的简单例子
- Spfa算法 (模板源代码)
- 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法
- SharePoint品牌化和自定义--创建会议工作区母版页
- 一个多月找实习的经历
- 黑马程序员——学习日记1 我的程序员之路
- android apk反编译
- FMOD的循环播放
- ZeroCrawler V0.1:多线程爬虫
- 浏览器渲染过程中的reflow是什么