有向图的无权图最短路径算法与带权图的Dijkstra算法
来源:互联网 发布:excel数据分级显示 编辑:程序博客网 时间:2024/06/05 18:33
最短路径算法是图论中的常见问题,在实际中有着较为广泛的应用,比如查找从一个地方到另一个地方的最快方式。问题可以概括为,对于某个输入顶点s,给出s到所有其它顶点的最短路径。水平有限,暂时先对这个问题的求解做简单记录。
无权图是有权最短路径的特例,即边的权重均是1。算法类似于BFS(宽度优先搜索),在实现时需要一个宽度优先搜索的队列。全局变量Distance用来保存所有点到输入顶点的距离。以邻接表表示图,无权图最短路径算法:
//无权图的最短路径算法static void UnweightedShortestPath(Graph g, int start){Queue<Integer> Q = new LinkedList<Integer>();int v,w;Q.offer(start);g.getVertics().get(start).setVivited(true); //输入顶点被标记为已访问for(int i=0;i<g.getVertexCount();i++)Distance[i] = -1; //初始化Distance,都为-1Distance[start] = 0;while(!Q.isEmpty()){v = Q.remove(); //v是队首的整数,记录了图中顶点的序号while(g.getAdjUnvisitedVertex(v)!=-1){ //寻找顶点v指向的所有的点w = g.getAdjUnvisitedVertex(v);g.getVertics().get(w).setVivited(true); //图的对应部分标记为已访问,每个顶点只能被访问一次if(Distance[w] == -1){Distance[w] = Distance[v]+1;Path[w] = v;Q.offer(w);}}//while}//while}Dijkstra算法是解决最短路径问题的常见算法,过程需要使用优先队列来代替无权图最短路径算法。源点到某个顶点的距离为从源点到该顶点的路径上的所有边权值之和,当新计算得到的距离小于原有的距离时,更新距离。
//Dijkstra算法static void Dijkstra(Graph g, int start){MinHeap PQ = new MinHeap(10, 0); //最小堆实现优先队列int v,w;PQ.Insert(new NodeWithProority(0,0));//NodeWithprority是一个只包括顶点的序号和权值(到给定起始点的距离)的类g.getVertics().get(start).setVivited(true);for( int i=0;i<g.getVertexCount();i++ )Distance[i]=-1;Distance[start] = 0;while(!PQ.isEmpty()){v = PQ.DeleteMin().node;while(g.getAdjUnvisitedVertex(v)!=-1){w = g.getAdjUnvisitedVertex(v);g.getVertics().get(w).setVivited(true); //图的对应部分标记为已访问,每个顶点只能被访问一次int d = Distance[v]+g.Weight(v, w); //计算新的距离if(Distance[w] == -1){Distance[w] = d;PQ.Insert(new NodeWithProority(w, d));Path[w] = v;}//ifif(Distance[w] > d){ //如果新的距离比原有的小,需要更新距离Distance[w] = d;for(int i=0;i<PQ.count;i++){if(PQ.array[i].node == w){PQ.array[i].priority = d;PQ.Parent(0);}}Path[w] = v;}//if}//whilefor(int j=0;j<g.getVertexCount();j++) //将访问标记初始化g.getVertics().get(j).setVivited(false);}//while}
0 0
- 有向图的无权图最短路径算法与带权图的Dijkstra算法
- 图论-有向带权图的最短路径(Dijkstra)算法
- 有向加权图的最短路径算法-Dijkstra
- 图(二)—— 一个有向无权图的最短路径算法
- 图(二)—— 一个有向无权图的最短路径算法
- 有向图中单个源点到终点的最短路径--Dijkstra算法与实现
- Dijkstra算法,Bellman-Ford算法和BFS算法解决有向图的单源最短路径问题
- 有向图的Dijkstra算法
- 有向图的Dijkstra算法
- Dijkstra 有向带权最短路径算法的简明阐释
- 基于连接矩阵的无向图最短路径Dijkstra算法
- Dijkstra算法实现有向图单源最短路径
- 无向网图的最短路径--Dijkstra算法
- 无权图的单源最短路径最短路径算法
- 图论算法之最短路径(有向无权图)
- 有向图最短路径问题---Dijkstra算法(过程)
- 有向图的Dijkstra算法实现模板
- Dijkstra最短路径算法(针对加权有向图)
- 数据库基础知识8
- MySQL
- MQ介绍与选型
- 深度学习(五十九)mxnet移植至android
- 华为畅玩5 (CUN-AL00) 刷入第三方twrp Recovery 及 root
- 有向图的无权图最短路径算法与带权图的Dijkstra算法
- mysql远程登录和忘记密码修改 以linux为例
- 动态规划—29合唱队形
- css 技巧
- 虚拟机脚本
- 计算机操作系统原理--Linux实例分析
- Linux下父进程与两子进程管道通信
- Tomcat通过CORS解决跨域问题
- ruby中类的写法以及属性,实例变量,类方法的用法