最短路 SPFA (对于bellman-ford 的优化)
2012-08-16 20:48
323 查看
SPFA算法:
既然是优化,那么肯定也不可能在图中出现负权值回路。
主要就是运用队列,如果一个点的信息被改变了,那么就把他加入队列,把队列中 点与此点相关的边 所连接的点的信息更新。直到队列为空。
code:
时间复杂度 O(km) k为平均每点如队列次数
既然是优化,那么肯定也不可能在图中出现负权值回路。
主要就是运用队列,如果一个点的信息被改变了,那么就把他加入队列,把队列中 点与此点相关的边 所连接的点的信息更新。直到队列为空。
code:
时间复杂度 O(km) k为平均每点如队列次数
#include<stdio.h> #include<queue> #include<string.h> using namespace std; #define MX 100000 #define M 100 int n,m; struct point { int to,w; //to为该边所指向的点,w为权值。 point *next; //下一个此点所指向的边 }; queue<int> Q; point* list[M]; //链接表 list[i]->next->next->next 等等的都是i点的出边。 int is[M],dist[M],path[M]; //is数组代表了在不在此队列 void SPFA(int v0) { point* now; for(int i=0;i<n;i++) //初始化 { dist[i]=MX; path[i]=-1; is[i]=0; } dist[v0]=0; is[v0]++; Q.push(v0); while(!Q.empty()) { int u=Q.front(); //拿出队列中的点 Q.pop(); is[u]--; //删除该点的标记 now=list[u]; //把这一点的链接表拿出来 while(now!=NULL) //只要还有边就继续 { if(dist[u]+now->w<dist[now->to]) //开始更新 { dist[now->to]=dist[u]+now->w; path[now->to]=u; if(!is[now->to]) //如果队列中此点不存在,就把他加入队列 { Q.push(now->to); is[now->to]++; } } now=now->next; //开始下一条边 } } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { memset(list,0,sizeof(list)); point* now; for(int i=0;i<m;i++) { now=new point; //这个很重要,要在for里边新开一个,否则会错。。。 int a,b,c; scanf("%d%d%d",&a,&b,&c); now->to=b; now->w=c; now->next=NULL; //指向为空 if(list[a]==NULL) list[a]=now; //如果此点还没有边,就存上 else //如果有 { now->next=list[a]; list[a]=now; } } SPFA(0); for(int i=0;i<n;i++) //记得释放存储空间 { now=list[i]; while(now!=NULL) { list[i]=now->next; delete now; now=list[i]; } } for(int i=1;i<n;i++) //输出 { printf("%d\n",dist[i]); int pa[M],k=1,now1=i; pa[0]=i; while(path[now1]!=-1) { pa[k]=path[now1]; now1=path[now1]; k++; } for(int j=k-1;j>0;j--) printf("%d->",pa[j]); printf("%d\n",pa[0]); } } return 0; }
相关文章推荐
- Bellman Ford+SPFA队列优化(路径还原 输出最短路的路径)
- hdu 2544 【总结】 Dijkstra,Bellman-Ford ,SPFA 最短路求法及对应优化
- hdu 2544 【总结】 Dijkstra,Bellman-Ford ,SPFA 最短路求法及对应优化
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
- 最短路问题(4种方法)(邻接矩阵,邻接表,bellman-ford,spfa)
- HDU 2544 最短路(四种写法:Floyd、Dijkstra、Bellman-Ford、SPFA)
- HDU 2544 最短路 floyd djkstra(邻接表,邻接矩阵) spfa bellman-ford 模板题
- 带权最短路 Dijkstra, SPFA, Bellman-Ford, ASP, Floyd-Warshall 算法分析
- HDU 2544 最短路【dijkstra+floyd+spfa+bellman-ford】
- 带权最短路 Dijkstra, SPFA, Bellman-Ford, ASP, Floyd-Warshall 算法分析
- 最短路(2)--bellman-ford和SPFA
- 最短路(Floyd+Dijkstra+(Bellman-Ford)SPFA)
- 最短路知识点总结(Dijkstra,Floyd,SPFA,Bellman-Ford)
- 带权最短路 Dijkstra, SPFA, Bellman-Ford, ASP, Floyd-Warshall 算法分析
- 浅谈最短路中的Bellman–Ford 算法 (SPFA
- Bellman-Ford 算法及其优化以及SPFA
- poj Wormholes (最短路 spfa Bellman-Ford 算法 邻接表实现)
- 总结一下最短路径的贝尔曼-福特算法(Bellman-Ford)及用队列优化(spfa)
- spfa--Bellman-Ford的队列优化
- hdu1874(最短路:一道题学习Floyd,Dijkstra,Bellman-Ford,SPFA)