求全局最短路径

问题描述

java实现Dijkstra算法(其它算法也可),求全局最短路径(图中任意两点的最短路径),求帮助!如下图,图中的权值都设为1。贴出完整代码,将不胜感激!

解决方案

本帖最后由 wawfully 于 2014-10-10 18:38:16 编辑
解决方案二:
还是别偷懒了吧,照着书上敲就行了,自己学习一下吧
解决方案三:
看不懂Dijkstra算法
解决方案四:
下面代码改编自http://blog.csdn.net/a9529lty/article/details/4047319去掉B1至C1的边,运行结果:[A1,A2]:1.0[A1,A2,A3]:2.0[A1,A2,B3]:2.0[A1,A2,A3,A4]:3.0[A1,A2,B3,B2]:3.0[A1,A2,A3,B4]:3.0[A1,A2,B3,C4]:3.0[A1,A2,A3,A4,A5]:4.0[A1,A2,B3,B2,B1]:4.0[A1,A2,A3,B4,B5]:4.0[C1,A1]:-1.0[C2,A1]:-1.0[A1,A2,B3,C4,C3]:4.0[A1,A2,B3,C4,C5]:4.0保留B1至C1的边,运行结果:[A1,A2]:1.0[A1,A2,A3]:2.0[A1,A2,B3]:2.0[A1,A2,A3,A4]:3.0[A1,A2,B3,B2]:3.0[A1,A2,A3,B4]:3.0[A1,A2,B3,C4]:3.0[A1,A2,A3,A4,A5]:4.0[A1,A2,B3,B2,B1]:4.0[A1,A2,A3,B4,B5]:4.0[A1,A2,B3,C4,C3]:4.0[A1,A2,B3,C4,C5]:4.0[A1,A2,B3,B2,B1,C1]:5.0[A1,A2,B3,C4,C3,C2]:5.0为什么去掉B1至C1的边,[C1,A1]和[C2,A1]就不连通了,[B3,C4]的边也可以使[C1,A1]、[C2,A1]连通啊?B1至C1边的连通的代码是下面两行://map.add(newSide("B1","C1",1));//map.add(newSide("C1","B1",1));

完整代码:importjava.util.ArrayList;publicclassDijkstra2{staticArrayList<Side>map=null;staticArrayList<String>redAgg=null;staticArrayList<String>blueAgg=null;staticSide[]parents=null;publicstaticvoidmain(String[]args){//初始化顶点集String[]nodes={"A1","A2","A3","A4","A5","B1","B2","B3","B4","B5","C1","C2","C3","C4","C5"};//初始化有向权重图map=newArrayList<Side>();map.add(newSide("A1","A2",1));map.add(newSide("A2","A1",1));map.add(newSide("A2","A3",1));map.add(newSide("A3","A2",1));map.add(newSide("A3","A4",1));map.add(newSide("A4","A3",1));map.add(newSide("A4","A5",1));map.add(newSide("A5","A4",1));map.add(newSide("B1","B2",1));map.add(newSide("B2","B1",1));map.add(newSide("B2","B3",1));map.add(newSide("B3","B2",1));map.add(newSide("B3","B4",1));map.add(newSide("B4","B3",1));map.add(newSide("B4","B5",1));map.add(newSide("B5","B4",1));map.add(newSide("C1","C2",1));map.add(newSide("C2","C1",1));map.add(newSide("C2","C3",1));map.add(newSide("C3","C2",1));map.add(newSide("C3","C4",1));map.add(newSide("C4","C3",1));map.add(newSide("C4","C5",1));map.add(newSide("C5","C4",1));map.add(newSide("A2","B3",1));map.add(newSide("B3","A2",1));map.add(newSide("A3","B4",1));map.add(newSide("B4","A3",1));map.add(newSide("B3","C4",1));map.add(newSide("C4","B3",1));//map.add(newSide("B1","C1",1));//map.add(newSide("C1","B1",1));//初始化已知最短路径的顶点集,即红点集,只加入顶点0redAgg=newArrayList<String>();redAgg.add(nodes[0]);//初始化未知最短路径的顶点集,即蓝点集blueAgg=newArrayList<String>();for(inti=1;i<nodes.length;i++)blueAgg.add(nodes[i]);//初始化每个顶点在最短路径中的父结点,及它们之间的权重,权重-1表示无连通parents=newSide[nodes.length];parents[0]=newSide("-1",nodes[0],0);for(inti=0;i<blueAgg.size();i++){Stringn=blueAgg.get(i);parents[i+1]=newSide(nodes[0],n,getWeight(nodes[0],n));}//找从蓝点集中找出权重最小的那个顶点,并把它加入到红点集中while(blueAgg.size()>0){MinShortPathmsp=getMinSideNode();if(msp.getWeight()==-1)msp.outputPath(nodes[0]);elsemsp.outputPath();Stringnode=msp.getLastNode();redAgg.add(node);//如果因为加入了新的顶点,而导致蓝点集中的顶点的最短路径减小,则要重要设置setWeight(node);}}/***//***得到一个节点的父节点**@paramparents*@paramnode*@return*/publicstaticStringgetParent(Side[]parents,Stringnode){if(parents!=null){for(Sidend:parents){if(nd.getNode()==node){returnnd.getPreNode();}}}return"-1";}/***//***重新设置蓝点集中剩余节点的最短路径长度**@parampreNode*@parammap*@paramblueAgg*/publicstaticvoidsetWeight(StringpreNode){if(map!=null&&parents!=null&&blueAgg!=null){for(Stringnode:blueAgg){MinShortPathmsp=getMinPath(node);floatw1=msp.getWeight();if(w1==-1)continue;for(Siden:parents){if(n.getNode()==node){if(n.getWeight()==-1||n.getWeight()>w1){n.setWeight(w1);n.setPreNode(preNode);//重新设置顶点的父顶点break;}}}}}}/***//***得到两点节点之间的权重**@parammap*@parampreNode*@paramnode*@return*/publicstaticfloatgetWeight(StringpreNode,Stringnode){if(map!=null){for(Sides:map){if(s.getPreNode().equals(preNode)&&s.getNode().equals(node))returns.getWeight();}}return-1;}/***//***从蓝点集合中找出路径最小的那个节点**@parammap*@paramblueAgg*@return*/publicstaticMinShortPathgetMinSideNode(){MinShortPathminMsp=null;if(blueAgg.size()>0){intindex=0;for(intj=0;j<blueAgg.size();j++){MinShortPathmsp=getMinPath(blueAgg.get(j));if(minMsp==null||msp.getWeight()!=-1&&msp.getWeight()<minMsp.getWeight()){minMsp=msp;index=j;}}blueAgg.remove(index);}returnminMsp;}/***//***得到某一节点的最短路径(实际上可能有多条,现在只考虑一条)**@paramnode*@return*/publicstaticMinShortPathgetMinPath(Stringnode){MinShortPathmsp=newMinShortPath(node);if(parents!=null&&redAgg!=null){for(inti=0;i<redAgg.size();i++){MinShortPathtempMsp=newMinShortPath(node);Stringparent=redAgg.get(i);StringcurNode=node;while(!"-1".equals(parent)){floatweight=getWeight(parent,curNode);if(weight>-1){tempMsp.addNode(parent);tempMsp.addWeight(weight);curNode=parent;parent=getParent(parents,parent);}elsebreak;}if(msp.getWeight()==-1||tempMsp.getWeight()!=-1&&msp.getWeight()>tempMsp.getWeight())msp=tempMsp;}}returnmsp;}}/***//***图中的有向边,包括节点名及他的一个前向节点名,和它们之间的权重**/classSide{privateStringpreNode;//前向节点privateStringnode;//后向节点privatefloatweight;//权重publicSide(StringpreNode,Stringnode,floatweight){this.preNode=preNode;this.node=node;this.weight=weight;}publicStringgetPreNode(){returnpreNode;}publicvoidsetPreNode(StringpreNode){this.preNode=preNode;}publicStringgetNode(){returnnode;}publicvoidsetNode(Stringnode){this.node=node;}publicfloatgetWeight(){returnweight;}publicvoidsetWeight(floatweight){this.weight=weight;}}classMinShortPath{privateArrayList<String>nodeList;//最短路径集privatefloatweight;//最短路径publicMinShortPath(Stringnode){nodeList=newArrayList<String>();nodeList.add(node);weight=-1;}publicArrayList<String>getNodeList(){returnnodeList;}publicvoidsetNodeList(ArrayList<String>nodeList){this.nodeList=nodeList;}publicvoidaddNode(Stringnode){if(nodeList==null)nodeList=newArrayList<String>();nodeList.add(0,node);}publicStringgetLastNode(){intsize=nodeList.size();returnnodeList.get(size-1);}publicfloatgetWeight(){returnweight;}publicvoidsetWeight(floatweight){this.weight=weight;}publicvoidoutputPath(){outputPath("-1");}publicvoidoutputPath(StringsrcNode){Stringresult="[";if(!"-1".equals(srcNode))nodeList.add(srcNode);for(inti=0;i<nodeList.size();i++){result+=""+nodeList.get(i);if(i<nodeList.size()-1)result+=",";}result+="]:"+weight;System.out.println(result);}publicvoidaddWeight(floatw){if(weight==-1)weight=w;elseweight+=w;}}

时间: 2024-08-12 09:40:06

求全局最短路径的相关文章

关于求迷宫最短路径(利用深度优先搜索)的问题

问题描述 关于求迷宫最短路径(利用深度优先搜索)的问题 利用深度优先查找迷宫的最短路径的程序,哪位大神可以帮帮忙吗? 解决方案 迷宫最短路径问题 解决方案二: http://bbs.csdn.net/topics/330218304 解决方案三: http://www.cnblogs.com/GoAhead/archive/2012/09/29/2708673.html

使用dijkstra求最短路径,动态添加数据,无法求出最短路径

问题描述 使用dijkstra求最短路径,动态添加数据,无法求出最短路径 10C package Test; import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.PriorityQueue; import com.test.Station; public class DijSuccess { public static int

算法题。给出一推点的坐标,和入口点,结束点,求出最短路径

问题描述 打个比方,我要去北京,有好多景点,比如A,B,C,D,E,F,每个点都有坐标,1:假设从A开始,D结束,求出一个路线最短的方案.2:假设从A开始,结束点任意,求出一个路线最短的方案. 解决方案 解决方案二:动态规划~我猜是这个.解决方案三:这第一个问题和第二个问题有区别吗,简直一模一样两点间直线距离最短,做一个排序,哪个最短去那个解决方案四:假如说从交通大学出发,天坛公园结束,要走完每一个其他景点,求最短路径.这不是经典的最短路径的题,也不是图的遍历,反正我也不懂,求大神帮忙解决方案五

求实现校园最短路径c/c++实现代码

问题描述 求实现校园最短路径c/c++实现代码 有没有大神有实现求校园最短路径的算法代码,用c或者c++实现最好,自己直接上手编实在做不来,求助啦谢谢 解决方案 图论:最短路径搜索--Dijkstra算法(c代码实现)最短路径的实现最短路径的实现

求两点之间最短路径-Dijkstra算法

 Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.注意该算法要求图中不存在负权边. 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径.(单源最短路径)   2

迷宫的最短路径算法 代码(C++)

题目: 给定一个大小为N*M的迷宫. 迷宫由通道和墙壁组成, 每一步可以向邻接的上下左右四格的通道移动. 请求出从起点到终点所需的最小步数. 请注意, 本题假定从起点一定可以移动到终点. 使用宽度优先搜索算法(DFS), 依次遍历迷宫的四个方向, 当有可以走且未走过的方向时, 移动并且步数加一. 时间复杂度取决于迷宫的状态数, O(4*M*N)=O(M*N). 代码: /* * main.cpp * * Created on: 2014.7.17 *本栏目更多精彩内容:http://www.bi

彻底弄懂最短路径问题

        只想说:温故而知新,可以为师矣.我大二的<数据结构>是由申老师讲的,那时候不怎么明白,估计太理论化了(ps:或许是因为我睡觉了):今天把老王的2011年课件又看了一遍,给大二的孩子们又讲了一遍,随手谷歌了N多资料,算是彻底搞懂了最短路径问题.请读者尽情享用--         我坚信:没有不好的学生,只有垃圾的教育.不过没有人理所当然的对你好,所以要学会感恩. 一.问题引入         问题:从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径--

Matlab最短路径问题记录

利用graphshortestpath 可以求最短路径,具体用法参考MATLAB帮助 S=[1 1 2 2 3 3 4 4 4 4 5 6 6 7 8]; %起始节点向量 E=[2 3 5 4 4 6 5 7 8 6 7 8 9 9 9]; %终止节点向量 W=[1 2 12 6 3 4 4 15 7 2 7 7 15 3 10]; %边权值向量,有向图,G(9,9)=0; 9个节点 G=sparse(S,E,W); %关联矩阵的稀疏矩阵表示 G(9,9)=0; P=biograph(G,[],

单源最短路径

 单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径.在弄清楚如何求算单源最短路径问题之前,必须弄清楚最短路径的最优子结构性质. 一.最短路径的最优子结构性质    该性质描述为:如果P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,k和s是这条路径上的一个中间顶点,那么P(k,s)必定是从k到s的最短路径.下面证明该性质的正确性.    假设P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,则有P(i,j)=P(i,k)+P(