`

Java:寻找两点之间所有路径

阅读更多

问题描述:

见下图,要求寻找A至Z的所有路径。

已知:两点之间的直接路径。例如:A-->B B-->C B-->E。。。。

 

 

 

 

解:

定义一个基本路径模型,属性:起始点和结束点。A-->B可抽象成new Road("A",'B');

package alogrim;
public class Road implements Cloneable {
	public Road(String begin,String end) {
		this.begin = begin;
		this.end = end;
	}
	private String begin;
	private String end;
	public String toString() {
		return begin + "->" + end;
	}
	public String getBegin() {
		return begin;
	}
	public void setBegin(String begin) {
		this.begin = begin;
	}
	public String getEnd() {
		return end;
	}
	public void setEnd(String end) {
		this.end = end;
	}
	
	public boolean equals(Object obj) {
		Road r = (Road)obj;
		if(this.getBegin().equals(r.getBegin()) && this.getEnd().equals(r.getEnd())) {
			return true;
		}
		return false;
	}
	
	public Object clone() {
		try {
			return super.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
}

 核心算法分两步:

1 过滤掉无用的路径。例如上图:G-->B G-->F D-->F都属于无效路径。

第一步:获取无效开始节点和无效结束点

	/**
	 * 过滤掉无用的节点
	 * 获取到无效开始节点和无效结束点
	 * @param all 所有节点
	 * @return
	 */
	public Set<String> filterInvalidNode(Set<String> all, List<Road> roads,
			Set<String> begins, Set<String> ends) {
		Set<String> result = new HashSet<String>();
		boolean isBegin = true;
		boolean isEnd = true;
		for (String str : all) {
			if (!existEnd(str, roads)) { // 没有以此节点结尾的路径,则证明此节点为无用节点
				isBegin = false;
				begins.add(str);
				// 删除以此节点为开始的路径
				// this.deleteBegin(str, roads);
			} else if (!existBegin(str, roads)) {// 没有以此节点开头的路径,则证明此节点为无用节点
				isEnd = false;
				ends.add(str);
				// this.deleteEnd(str, roads);
			} else {
				result.add(str); // 有用的节点
			}
		}
		if (isBegin == true && isEnd == true) {
			return result;
		} else {
			return filterInvalidNode(result, roads, begins, ends);
		}
	}

 第二步:删除无效路径

	/**
	 * 获取到需要删除的路径
	 * 
	 * @param begins
	 * ---无效起始节点
	 * @param ends
	 * ---无效终结点
	 * @param roads
	 */
	public Set<Road> deleteRoad(Set<String> begins, Set<String> ends,
			List<Road> roads) {
		Set<Road> set = new HashSet<Road>();
		for (String str : begins) {
			for (Road r : roads) {
				if (r.getBegin().equals(str)) {
					set.add(r);
				}
				if (r.getEnd().equals(str)) {
					set.add(r);
				}
			}
		}
		return set;
	}

 2 路径遍历,确保找到两点之间的所有可通过路径,需要确保每条基本路径都被访问过。本算法采用自上而下遍历方式。详细含义如下:

List<Road> roadList = null; //已知的路径
	List<String> backList = new ArrayList<String>(); //存放已经访问过的节点
	Set<String> resultSet = new HashSet<String>(); //目的路径--访问结果
	Set<Road> cirList = new HashSet<Road>(); 	//回路
	
	/**
	 * 路径遍历的核心算法
	 * @param start
	 * ---需要寻找的起始节点。本案例为A
	 * @param destination
	 * ---需要寻找的终结点。本案例为Z
	 */
	public void getAllRoad(String start, String destination) {
		backList.add(start);
		for (int z = 0; z < roadList.size(); z++) {
			if (roadList.get(z).getBegin().equals(start)) { //寻找找以start开始的路径
				if (roadList.get(z).getEnd().equals(destination)) { //如果以destination结尾,则为一条有效路径
					resultSet.add(backList.toString().substring(0, backList.toString().lastIndexOf("]")) + "," + destination + "]");
					continue;
				}
				if (!backList.contains(roadList.get(z).getEnd())) {//此节点仍未遍历,则继续迭代
					getAllRoad(roadList.get(z).getEnd(), destination);
				} else {//證明有回路
					cirList.add(roadList.get(z));
					//System.out.println("wwww");
				}
			}
		}
		backList.remove(start);
	}

 

至此已经完成‘两点之间所有路径’的核心算法。详细代码见附件,main方法在MapVisit里

9
0
分享到:
评论
2 楼 aredapple 2012-04-07  
不错,工作中也正好要用到,向楼主表示深深的敬意。
1 楼 vincent-lee 2009-07-02  
你这部分代码正好是我需要的,前几天下载下来做了一些改造用着挺好。非常感谢!

相关推荐

    求两点之间的所有路径(广度优先与回溯法结合)

    本程序很好的解决了两点之间的所有路径问题,无向图、有向图均可。采用广度优先算法和回溯法的结合,将最终结果存放在一个动态二维向量中。并将其打印出来(打印出顺序经过的结点)。运行环境为visual studio 2005或...

    java查找无向连通图中两点间所有路径的算法

    2. 定义两点一个为起始节点,另一个为终点,求解两者之间的所有路径的问题可以被分解为如下所述的子问题:对每一个与起始节点直接相连的节点,求解它到终点的所有路径(路径上不包括起始节点)得到一个路径集合,将...

    java搜索无向图中两点之间所有路径的算法

    java搜索无向图中两点之间所有路径的算法 java搜索无向图中两点之间所有路径的算法是计算机科学中的一种重要算法,它可以在无向图中找到两点之间的所有路径。该算法的实现思路是首先整理节点间的关系,为每个节点...

    (Java)求两顶点间最短路径和距离

    在计算机科学中,寻找图中两个顶点之间的最短路径是一个常见的问题,特别是在网络路由、图形理论和数据结构中。本篇文章将详细讲解如何使用Java实现这个功能,主要聚焦于Dijkstra算法,这是一种广泛用于解决单源最短...

    java 无向图所有最短路径算法的实现

    在计算机科学中,无向图是一种特殊的图结构,其中任意两个节点之间都可以通过边相互连接,而这些边没有方向性。最短路径问题是一个经典的问题,寻找无向图中的最短路径有着广泛的应用,比如路由选择、网络优化等。本...

    图论算法-求(有向)图中任意两点间所有路径

    在寻找两点间的所有路径时,可以从起点开始,对每一条可行的边进行递归调用,直到达到终点。然后回溯并尝试其他未访问过的边,记录所有到达终点的路径。DFS适合于边较多但节点较少的情况,因为它可以避免大量中间...

    矩阵方格中求两点之间的最短路径java版

    在IT领域,尤其是在图形算法和数据结构中,求解两点之间的最短路径是一个经典问题。本问题中的场景是在一个7*5的矩阵方格中,角色A需要从起点出发到达终点B,同时需要避开障碍物(标记为球)。移动规则是A只能向周围...

    java 最短路径 问题 动态规划

    最短路径问题有多种变体,比如单源最短路径问题、任意两点间的最短路径问题等。动态规划是一种解决这类问题的有效方法之一。 ### 2. 动态规划原理简介 动态规划是一种通过把原问题分解为相互重叠的子问题来求解...

    java 版路径分析

    5. **最短路径分析**:寻找两个或多个点之间距离最短的路径,通常考虑的是实际行驶距离或时间。 6. **成本最小化分析**:除了距离,还可以考虑其他因素,如交通流量、燃油消耗等,找出总成本最低的路径。 7. **...

    弗洛伊德(Floyd)算法求任意两点间的最短路径

    3. **社交网络分析**:在社交网络中,寻找两个人之间的最短关系路径可以揭示他们之间的紧密程度。 4. **游戏开发**:在游戏世界中,寻找角色或AI角色的最短移动路径是常见的需求。 ### 总结 弗洛伊德算法是一种...

    基于Java多线程实现所有顶点间最短路径的并行算法

    最短路径问题是指在一个加权图中寻找两点之间的最短路径。这一问题不仅在图论中有重要意义,在实际应用中也极为广泛,例如在地理信息系统(GIS)中用于路径规划、城市交通管理以及电子导航等领域。 #### Dijkstra...

    最短路径算法java

    最短路径算法是图论中的一个经典问题,用于寻找图中两点之间路径的最小成本或时间。在Java中实现这样的算法可以帮助我们解决多种实际问题,比如网络路由、交通规划等。这里我们将深入探讨单源点最短路径的Dijkstra...

    用java写的查询某市地铁的最短路径,递归算法

    在实现最短路径算法时,开发者可能采用了Dijkstra算法或A*搜索算法,这两种算法都适合在图中寻找最短路径。Dijkstra算法是一种基于贪心策略的算法,它每次选择当前未访问节点中距离起点最近的一个并扩展。而A*算法则...

    基于gdal 最短路径计算

    描述中提到的"cal文件夹是计算类"可能包含了自定义的算法实现,这些算法可能基于Dijkstra算法、A*算法或者其他图搜索策略来寻找两个点之间的最短路径。Dijkstra算法是一种广泛应用的单源最短路径算法,适用于所有边...

    车辆路径问题 (VRP),Java 上的遗传算法解决方案_java_代码_下载

    - `VehicleRoutingProblem.java`: 定义VRP问题的类,包括客户点的位置、车辆信息以及计算总行驶距离的方法。 - `Solution.java`: 表示一个解决方案,即一条车辆路线,包含适应度函数的计算。 - `Population.java`: ...

    两个城市的最短路径dijkstra算法Java代码

    Dijkstra算法是图论中的一个经典算法,由荷兰计算机科学家艾兹格·迪科斯彻在1956年提出,主要用于寻找有向图或无向图中源节点到其他所有节点的最短路径。在这个Java实现中,我们专注于解决两城市间的最短路径问题。...

    java 语言最短单元路径

    Dijkstra于1956年发明的一种用于寻找图中两个节点之间最短路径的算法。它适用于所有边的权重为非负值的情况。算法的核心思想是从起始节点开始,逐步扩展到所有其他节点,每次选择未访问节点中距离起始节点最近的一...

    Java实现Floyd算法求最短路径

    Java实现Floyd算法是一种用于寻找有向图中所有顶点对之间最短路径的经典算法。Floyd算法可以处理包含正权边的图,并能处理图中的负权边,但不能有负权环。算法的基本思想是动态规划,通过逐步增加中间顶点来优化各个...

    Java实现的Dijkstra最短路径算法.

    此外,它还可以用于解决单源最短路径问题,例如在地图导航中找出两点间的最短路线。 压缩包文件"Java-Dijkstra-master"可能包含了完整的Java代码示例,包含了上述描述的Dijkstra算法的实现。你可以通过解压并查看...

Global site tag (gtag.js) - Google Analytics