简单图论:遍历所有最短路径
来源:互联网 发布:数据挖掘方向的研究生 编辑:程序博客网 时间:2024/05/16 04:44
今天遇到了两道要求遍历所有最短路径的题,我一直做不对的原因竟是我把无向图当成了有向图,郁闷的要死。
解决遍历所有最短路径,其实思路很简单,首先通过经典算法[各种算法,Dijkstra,bellman,floyd]求出最短路径的长度,然后就只能DFS来找寻起始点、终点一样,长度为最短路径长度的路径即可,在DFS中可以使用Path[]数组来保存路径。
DFS时注意要剪枝,路径上已经走过的点不要重复走,可以用Visited[]来保存。
这里要注意的是,如果边的权均为正,那么DFS的效率还是挺高的,可以在大于最短路时直接剪掉
如果边权存在负值,DFS就剪不了那么多枝了...
基本的算法如下:
初始时使用DFS(起点,0)即可,其中D表示的是终点,可以作为全局变量,start表示起始点,整个图都使用二维数组来存的,不过转成表算法也差不多。
ansdis表示的是之前求出来的最短路,而shortnum统计最短路径的条数。
void DFS(int start, int dis){ int i,j; if(dis>ansdist) return; //带负权则不可剪枝 for(i=0;i<N;i++) { if(!Visited[i] && i!=start && Graph[start][i]!=Infinity) { if(dis + Graph[start][i] > ansdist) continue; //带负权则不可剪枝 else if(i==D && dis+Graph[start][i]==ansdist) { Path[start]=i; shortnum++; //此时就可以把Path[]路径打印或存储 } else { Visited[start]=true; int temp=Path[start]; Path[start]=i; DFS(i,dis+Graph[start][i]); Visited[start]=false; Path[start]=temp; } } }}
- 简单图论:遍历所有最短路径
- 所有节点对最短路径 超时 优先队列 + dijkstra + 遍历前驱子图
- 打印无权无向图的所有最短路径
- 图的遍历、拓扑排序、最短路径算法
- 图的遍历、拓扑排序、最短路径算法
- 十二、图的遍历--(4)最短路径简化版
- 图的遍历、最小生成树、最短路径
- POJ 1125 可不可能遍历所有点情况下的最短路径
- 简单迷宫建立,路径的遍历,最短路径的生成
- 图@ 最短路径
- 图---最短路径
- 图 - 最短路径
- 所有节点对的最短路径
- 所有节点对最短路径
- 两点之间的所有最短路径
- 城市地图--深度优先遍历最短路径
- hdu 1599 find the mincost route(无向图的最小环:求从一个点遍历所有节点以后回到原点的最短路径)
- 最简单的最短路径算法
- poj 1014
- 无监督学习特征--稀疏编码、深度学习、ICA部分代表文献-------之一
- HTNL+CSS注意事项
- mysql amoeba安装配置步骤
- 爱奇艺面试记录--电话面试
- 简单图论:遍历所有最短路径
- mysql keepalived安装配置步骤
- 非线性特征提取技术 参考文献---之四
- 文艺程序员对爱的表白方式
- amoeba
- SQL中N $ # @的作用
- ubuntu12.04 64bit 编译android源码时遇到的问题
- amoeba.xml
- eclipse开发国际化项目利器:MultiProperties