`
junlas
  • 浏览: 63560 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

最短路径问题

阅读更多

  这个算法的实现是基于图的邻接矩阵表示法。这里使用的是Dijkstra来计算最短路径。

 

 //下面是代码:package testShortPath;

public class Vertex {
	public char label;
	public boolean isVisited;
	
	public Vertex(char label) {
		this.label = label;
	}
}

 package testShortPath;

public class ShortDistAndPath {
	public int distance;
	
	public ShortDistAndPath(int distance) {
		this.distance = distance;
	}
}

 package testShortPath;

import java.util.ArrayList;
import java.util.List;

public class Graph {
	/**最大的顶点数目*/
	private final int MAX_VERTS = 20;
	/**无穷大*/
	private final int INFINITY = 1000000;
	/**顶点列表*/
	private Vertex[] vertexList;
	/**邻接矩阵*/
	private int[][] adjMat;
	/**顶点数目*/
	private int vertNum;
	/**访问过的顶点数目*/
	private int visitedVertNum;
	/**最短路径以及路径的数组*/
	private ShortDistAndPath[] shortDistAndPathStrs;
	/**当前的顶点*/
	private int currentVert;
	/**指定顶点距当前顶点的距离*/
	private int startToCurrentDist;
	
	public Graph() {
		vertexList = new Vertex[MAX_VERTS];
		adjMat = new int[MAX_VERTS][MAX_VERTS];
		vertNum = 0;
		visitedVertNum = 0;
		for(int j=0;j<MAX_VERTS;j++) {
			for(int k = 0;k < MAX_VERTS;k++) {
				adjMat[j][k] = INFINITY;
			}
		}
		shortDistAndPathStrs = new ShortDistAndPath[MAX_VERTS];
	}
	
	public void addVertex(char lab){
		vertexList[vertNum ++] = new Vertex(lab);
	}
	
	public void addEdge(int start,int end,int weight) {
		adjMat[start][end] = weight;
	}
	
	/**
	 * 算法的核心
	 */
	public void path() {
		int startTree = 0;
		vertexList[startTree].isVisited = true;
		visitedVertNum = 1;
		for(int i=0;i<vertNum;i++) {
			shortDistAndPathStrs[i] = new ShortDistAndPath(adjMat[startTree][i]);
		}
		while (visitedVertNum < vertNum) {
			int minIndex = getMin();
			int minDist = shortDistAndPathStrs[minIndex].distance;
			if(minDist == INFINITY) {
				System.out.println("There are unreachable vertices.");
				break;
			} else {
				currentVert = minIndex;
				startToCurrentDist = minDist;
			}
			vertexList[currentVert].isVisited = true;
			visitedVertNum ++;
			adjust_sPath();
		}
		displayPaths();
	}
	
	/**
	 * 得到未访问的,最短路径的顶点的下标
	 * @return
	 */
	public int getMin() {
		int minDist = INFINITY;
		int minIndex = 0;
		for(int i=0;i<vertNum;i++) {
			if(!vertexList[i].isVisited && shortDistAndPathStrs[i].distance < minDist) {
				minDist = shortDistAndPathStrs[i].distance;
				minIndex = i;
			}
		}
		return minIndex;
	}
	
	public void adjust_sPath() {
		int vertIndex = 1;
		while(vertIndex < vertNum) {
			if(vertexList[vertIndex].isVisited) {
				vertIndex ++;
				continue;				
			}
			int specificToNext = startToCurrentDist + adjMat[currentVert][vertIndex];
			int shortDist = shortDistAndPathStrs[vertIndex].distance;
			if(shortDist > specificToNext) {
				shortDistAndPathStrs[vertIndex].distance = specificToNext;
			}
			vertIndex ++;
		}
	}
	
	public void displayPaths() {
		for(int j=0;j<vertNum;j++) {
			System.out.print(vertexList[0].label + "-->" + vertexList[j].label + "=");
			if(shortDistAndPathStrs[j].distance == INFINITY) {
				System.out.print("inf");
			} else {
				System.out.print(shortDistAndPathStrs[j].distance);
			}
			System.out.println();
		}
	}
	
	/**
	 * Test
	 * @param args
	 */
	public static void main(String[] args) {
		Graph theGraph = new Graph();
		
		theGraph.addVertex('A');//0
		theGraph.addVertex('B');//1
		theGraph.addVertex('C');//2
		theGraph.addVertex('D');//3
		theGraph.addVertex('E');//4
		
		theGraph.addEdge(0, 1, 50);
		theGraph.addEdge(0, 3, 80);
		theGraph.addEdge(1, 2, 60);
		theGraph.addEdge(1, 3, 90);
		theGraph.addEdge(2, 4, 40);
		theGraph.addEdge(3, 2, 20);
		theGraph.addEdge(3, 4, 70);
		theGraph.addEdge(4, 1, 50);
		
		theGraph.path();
		System.out.println();
		
	}
}

   运行结果为:

A-->A=inf

A-->B=50

A-->C=100

A-->D=80

A-->E=140

分享到:
评论

相关推荐

    用贪心算法解单源最短路径问题

    用贪心算法解单源最短路径问题 在计算机科学和信息技术领域中,单源最短路径问题是指从一个源点到其他顶点的最短路径问题。它是一种典型的图论问题,广泛应用于交通网络、通信网络、计算机网络等领域。贪心算法是...

    最短路径问题 运筹学

    最短路径问题在计算机科学和运筹学中是一项核心任务,尤其在图论与网络分析领域,它旨在找出网络中的最短路径,以便优化资源分配、提高效率或解决其他相关问题。Floyd算法,又称为Floyd-Warshall算法,是解决这一...

    用遗传算法求解最短路径问题

    在图论领域,寻找最短路径问题是其中的一个经典问题,其核心是找到从图中某个顶点到另一个顶点的最短路径。传统的方法如Dijkstra算法和Bellman-Ford算法在小规模或特定类型的图上效果较好,但在大型、复杂或动态变化...

    《数据结构课程设计》最短路径问题实验报告

    《数据结构课程设计》最短路径问题实验报告主要围绕如何设计和实现一个交通咨询系统,该系统能够解决从一个城市到另一个城市的最短路径、最低花费或最少时间的问题。在这个实验报告中,我们重点关注以下几个核心知识...

    实现求解单源点最短路径问题

    【单源点最短路径问题】是指在图论中,给定一个有向图G=(V,E),其中V是顶点集合,E是边集合,每个边e上有权重c(e),我们想要找到从一个特定顶点V0出发到图中其他所有顶点的最短路径。这个问题通常出现在网络优化、...

    多段图的最短路径问题

    在计算机科学和图论中,"多段图的最短路径问题"是一个经典的问题,它涉及到寻找在具有多个阶段或段的图中从一个源节点到一个目标节点的最经济路径。多段图通常用于模拟复杂的网络,如交通网络、通信网络或者任务调度...

    美国硅谷城镇地图——最短路径问题

    在IT领域,尤其是在图论和算法设计中,解决“最短路径问题”是一个经典而重要的任务。本案例中,我们关注的是美国硅谷城镇地图上的最短路径问题,它涉及到网络中的节点(城镇)和边(连接城镇的路径),以及边上的...

    lingo解最短路径问题

    lingo解最短路径问题。城市之间线路及距离已知。从某个城市出发,到达目的城市,通过lingo编程选取最短路径。

    多段图的最短路径问题 动态规划法——C++代码

    在计算机科学领域,解决最短路径问题是一项基本任务,它广泛应用于网络路由、地图导航、物流优化等场景。本主题关注的是多段图的最短路径问题,通过动态规划法来求解。动态规划是一种利用子问题的最优解来构建全局最...

    公交车最短路径问题 数据结构 C++

    在IT领域,尤其是在算法设计和计算机科学中,解决公交车最短路径问题是一个常见的挑战。这个问题涉及到网络图论,其中的数据结构和编程语言如C++扮演着至关重要的角色。本篇文章将深入探讨这个问题,并通过C++语言来...

    用java通过文件操作实现最短路径问题

    下面我们将详细讨论如何在Java中通过文件操作来解决最短路径问题。 首先,我们需要了解最短路径算法。其中,Dijkstra算法和Floyd-Warshall算法是两种常用的方法。Dijkstra算法适用于单源最短路径问题,而Floyd-...

    基于贪心法求解单源最短路径问题.docx

    "基于贪心法求解单源最短路径问题" 本资源是关于基于贪心法求解单源最短路径问题的实验报告,包括实验内容、算法设计、算法描述、算法正确性证明、算法分析、算法实现与测试等部分。 实验目的:理解贪心法的核心...

    分支定界算法求解带约束的最短路径问题

    在“分支定界算法求解带约束的最短路径问题”中,我们聚焦于如何利用这种算法来解决一个特定类型的网络流问题,即在满足特定约束条件下找出从起点到终点的最短路径。 最短路径问题是一个经典的图论问题,Dijkstra...

    动态规划解决最短路径问题

    JAVA版动态规划解决最短路径问题 啊

    动态规划原理及最短路径问题_路径规划_路径动态规划_lettereoo_动态规划;最短路径_

    在这个场景中,我们关注的是如何利用动态规划来解决最短路径问题。 最短路径问题是一个经典的图论问题,旨在找到网络中的两个节点之间具有最小权重的路径。这在物流、交通、网络路由等领域有着广泛应用。动态规划在...

    最短路径问题 大一数据结构最短路径问题

    最短路径问题 大一数据结构最短路径问题

    弗洛伊德算法实现最短路径问题

    弗洛伊德算法,全称为弗洛伊德-沃瑟曼算法(Floyd-Warshall Algorithm),是图论中一种著名的解决所有顶点对之间最短路径问题的算法。它适用于有向图或无向图,能找出图中任意两个顶点之间的最短路径,并且在计算...

    模拟退火算法解决最短路径问题

    总的来说,模拟退火算法提供了一种有效解决最短路径问题的途径,特别是在面对大规模问题时,能够以可接受的计算成本找到较好的解决方案。结合C++的高效编程能力,我们可以构建出适用于各种实际场景的算法模型。

Global site tag (gtag.js) - Google Analytics