spfa算法(FIFO优化的BellmanFord算法)
来源:互联网 发布:demo软件是什么意思 编辑:程序博客网 时间:2024/05/22 08:13
spfa算法用FIFO队列代替BellmanFord算法的循环检查,所以在效率上是相当不错的;
struct Edge{ int from;//出发结点 int to;//终止结点 int dist;//距离 Edge(int u,int v,int d):from(u),to(v),dist(d){}};//一些重要的参数和初始化int n;//n为结点数int m;//m为边的编号vector<Edge> edges;vector<int> G[maxn];int d[maxn];//源点到各个点的距离int p[maxn];//最短路中的上一条弧void init(int n){ this->n=n; for(int i=0;i<n;++i) { G[i].clear(); } edges.clear();}void AddEdge(int from,int to,int dist){ edges.push_back(Edge(from,to,dist)); m=edges.size(); //把边的编号压入,相当于邻接表 G[from].push_back(m-1);}bool bellman_ford(int s)//s为源点{ queue<int> Q; memset(inq,0,sizeof(inq));//inq[]代表是否已经在队列中 memset(cnt,0,sizeof(cnt));//cnt[]代表进入队列几次 for(int i=0;i<n;++i) d[i]=INF; //d[i]为到源点的距离 d[s]=0; inq[s]=true; Q.push(s); while(!Q.empty()) { int u=Q.front(); Q.pop(); inq[u]=false; //G[u]是图的邻接表储存,其本身是vector for(int i=0;i<G[u].size();++i) { Edge& e=edges[G[u][i]]; if(d[u]<INF&&d[e.to]>d[u]+e.dist) { d[e.to]=d[u]+e.dist; p[e.to]=G[u][i]; if(!inq[e.to]) { Q.push(e.to); inq[e.to]=true; if(++cnt[e.to]>n) return false; } } } } return true;}
1 0
- spfa算法(FIFO优化的BellmanFord算法)
- SPFA:改进的BellmanFord求单源最短路径算法
- BellmanFord 算法
- spfa算法的一些优化
- SPFA算法的两个优化
- bellman-ford算法的优化spfa算法
- SPFA算法 Bellman_ford优化
- spfa的SLF 和 LLL优化算法
- POX控制器下bellmanford算法的实现
- BellmanFord算法框架
- BellmanFord算法框架
- BellmanFord算法模板
- C++实现Bellmanford算法
- BellmanFord判环算法
- 单源最短路径算法(BellmanFord算法)
- FIFO算法
- Bellman-ford队列优化算法 SPFA算法
- SPFA算法的实现
- @property
- Android按返回键退出程序
- acm1005
- 任务和特权级保护(三)——《x86汇编语言:从实模式到保护模式》读书笔记34
- 5-35 有理数均值 (20分)
- spfa算法(FIFO优化的BellmanFord算法)
- 5-36 复数四则运算 (15分)
- 外排序的实现(平台Linux & 语言C++)
- 微信6.0界面实现难点
- 5-37 整数分解为若干项之和 (20分)
- 5-38 数列求和-加强版 (20分)
- Android Screen Monitor真机抓屏教程
- C++实验—6矩阵求和
- hdu 5045 状压dp