Bellman算法优化使用邻接表C++实现
2015-04-14 12:33
393 查看
用临接表来存储图的时间空间复杂度是O(M),遍历每一条边的时间复杂度也是O(M),如果一个图是稀疏图的话,M要远小于N^2,因此稀疏图选用邻接表来存储比用邻接矩阵来存储好很多。
#include<iostream> #include<queue> using namespace std; int main() { int points,edgs; cin>>points>>edgs; int point1[10],point2[10],quanzhi[10]; int first[6],next[8];//数组的大小要比实际的点数要大1 int infinity=99999999; for (int i=1;i<=points;i++) { first[i]=-1; } int p1,p2,w; for (i=1;i<=edgs;i++) { cin>>p1>>p2>>w; point1[i]=p1; point2[i]=p2; quanzhi[i]=w; next[i]=first[point1[i]];//first[]存储的是顶点的编号 first[point1[i]]=i;//next[]存储的是第i条边的下一条边的编号 } int flag[10],dis[10]; for (i=1;i<=points;i++) { flag[i]=0; dis[i]=infinity; } queue<int>si;//队列用来记录使源点到顶点距离变短的点 si.push(1); //在一轮循环结束后使队顶出列换队列下一个点比较判断 flag[1]=1; int k; dis[1]=0; while (!si.empty()) { k=first[si.front()];//优化主要用了源点的邻接点松弛相关边而不用1条边2条边 //循环,减少比较次数 while (k!=-1) { if (dis[point2[k]]>dis[point1[k]]+quanzhi[k]) { dis[point2[k]]=dis[point1[k]]+quanzhi[k]; if (flag[point2[k]]==0) { si.push(point2[k]); flag[point2[k]]=1; } } k=next[k]; } flag[si.front()]=0;//一轮结束队顶出列 si.pop(); } for (i=1;i<=points;i++) { cout<<dis[i]<<" "; } cout<<endl; }
相关文章推荐
- 使用插入排序优化快速排序的算法实现
- C/C++面试之算法系列--借刀杀人,不使用任何中间变量实现strlen
- 最速下降优化算法的C++实现
- Kmp字符匹配算法优化C++实现
- 图论;单源最短路径;拓扑排序+松弛(有向无回路);Bellman-Ford(回路,负权回路);Dijkstra(无负权,可回路);可以用最小堆实现算法的优化;
- 图论;单源最短路径;拓扑排序+松弛(有向无回路);Bellman-Ford(回路,负权回路);Dijkstra(无负权,可回路);可以用最小堆实现算法的优化;
- [C++] 测试硬件popcnt(位1计数)指令与各种软件算法,利用模板实现静态多态优化性能
- C++实现Kmp字符匹配算法的优化版
- 算法与数据结构基础8:C++实现有向图——邻接表存储
- 图论;单源最短路径;拓扑排序+松弛(有向无回路);Bellman-Ford(回路,负权回路)Dijkstra(无负权,可回路);可以用最小堆实现算法的优化;
- 算法学习 - Bellman-Ford(贝尔曼福特)算法(C++实现)
- 求两个字符串最长公共子序列的算法优化(C++实现)
- poj Wormholes (最短路 spfa Bellman-Ford 算法 邻接表实现)
- 使用C++实现simplex算法
- 算法代码实现之Union-Find,C++实现,quick-find、quick-union、加权quick-union(附带路径压缩优化)
- 数据结构与算法——图的邻接表表示法类的C++实现
- 求图中最短路径算法之Dijkstra算法——C++实现并优化
- SSE图像算法优化系列十一:使用FFT变换实现图像卷积。
- SSE图像算法优化系列十一:使用FFT变换实现图像卷积。
- 不使用随机数的洗牌算法实现(C++实现)