图论之最短路径算法
2015-03-06 00:19
113 查看
dijkstra算法
基本思想:某最短路径上的点与源点之间的最短路径必然也在改最短路径之上,采用贪心策略,每次选取当前最短路径即可。
floyd算法
基本思想:采用动态规划思想,点i,j之间的最短路径要么包含点k,要么不包含点k,选择最小的即可。
spfa算法
基本思想:spfa算法是bellman-ford算法的队列实现,用dis数组表示点与源点之间的当前最短距离,用数组vis标记点是否在队列中,初始只有源点在队列中,每次取出队头的点v,依次枚举从v出发的边v->u,设边的长度为len,判断Dist[v]+len是否小于Dist[u],若小于则改进Dist[u],并且由于S到u的最短距离变小了,有可能u可以改进其它的点,所以若u不在队列中,就将它放入队尾。这样一直迭代下去直到队列变空,也就是S到所有的最短距离都确定下来,结束算法。若一个点入队次数超过n,则有负权环。
基本思想:某最短路径上的点与源点之间的最短路径必然也在改最短路径之上,采用贪心策略,每次选取当前最短路径即可。
void dijkstra(int n) { int num=1,i; int min,pos; vis =1; while(num<n)//n-1次循环 { min=MaxInt; for(i=1; i<n; i++) if(vis[i]==0 && dis[i]<min) { pos=i; min=dis[i]; } vis[pos]=1; dis[pos]=min; for(i=1; i<n; i++) if(vis[i]==0 && dis[i]>dis[pos]+map[pos][i]) dis[i]=min+map[pos][i];//更新权值 num++; } }
floyd算法
基本思想:采用动态规划思想,点i,j之间的最短路径要么包含点k,要么不包含点k,选择最小的即可。
void floyd(int n) { int i,j,k; memset(dis,MaxInt,sizeof(dis)); for(i=1; i<=n; i++) for(j=1; j<=n; j++) for(k=1; k<=n; k++) if(dis[i][j] > dis[i][k]+dis[k][j] ) dis[i][j] = dis[i][k]+dis[k][j]; }
spfa算法
基本思想:spfa算法是bellman-ford算法的队列实现,用dis数组表示点与源点之间的当前最短距离,用数组vis标记点是否在队列中,初始只有源点在队列中,每次取出队头的点v,依次枚举从v出发的边v->u,设边的长度为len,判断Dist[v]+len是否小于Dist[u],若小于则改进Dist[u],并且由于S到u的最短距离变小了,有可能u可以改进其它的点,所以若u不在队列中,就将它放入队尾。这样一直迭代下去直到队列变空,也就是S到所有的最短距离都确定下来,结束算法。若一个点入队次数超过n,则有负权环。
void spfa(int n) { int i,temp; dis =0; vis =1; queue<int> Q; Q.push(n); while(!Q.empty()) { temp=Q.front(); Q.pop(); for(i=1; i<n;i++) if(dis[i]>dis[temp]+map[temp][i]) { dis[i]=dis[temp]+map[temp][i]; if(!vis[i]) { Q.push(i); vis[i]=1; } } vis[temp]=0; } }
相关文章推荐
- 【图论】最短路径算法大全
- 各最短路径算法(图论)比较
- 图论(二):图的四种最短路径算法
- 图论最短路径算法——Dijkstra
- 图论;单源最短路径;拓扑排序+松弛(有向无回路);Bellman-Ford(回路,负权回路)Dijkstra(无负权,可回路);可以用最小堆实现算法的优化;
- Dijkstra求单源最短路径(图论基础算法)
- 最短路径算法(图论)
- 初学图论-Dijkstra单源最短路径算法基于优先级队列(Priority Queue)的实现
- 算法-图论-Dijstra寻找最短路径
- 无权最短路径BFS(广度优先搜索)算法(图论)
- 图论最短路径算法——SPFA
- 图论--Matlab实现最短路径算法
- 图论之Dijkstra最短路径算法
- 图论(二):图的四种最短路径算法
- 图论最短路径算法-Dijkstra算法-单源最短路径-JAVA语言描述
- 图论算法之最短路径
- 图论——单源最短路径算法之Dijkstra算法
- 图论算法之单源最短路径
- 图论算法之最短路径(具有负边值的图)
- 紫书第十一章-----图论模型与算法(最短路径Dijkstra算法Bellman-Ford算法Floyd算法)