`

带权有向图 - 边上权值非负情形的单源最短路径问题

J# 
阅读更多
1. 问题描述:
   给定一个带权有向图D与源点v, 求从v到D中其他顶点的最短路径。限定个边上的权值大于或等于0.

2. java实现:

package boke.graph.shortpath1;

import java.util.Stack;

/**
 * 问题描述: 给定一个带权有向图D与源点v, 求从v到D中其他顶点的最短路径。限定个边上的权值大于或等于0.
 * 
 * 带权有向图 - 边上权值非负情形的单源最短路径问题
 * 
 * @since jdk1.5及其以上
 * @author 毛正吉
 * @version 1.0
 * @date 2010.06.06
 * 
 */
public class Graph {
	public static final float MAXNUM = Float.MAX_VALUE; // 表示无穷大

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int n = 5;
		float[][] edge = { { 0, 10, MAXNUM, 30, 100 },
				{ MAXNUM, 0, 50, MAXNUM, MAXNUM },
				{ MAXNUM, MAXNUM, 0, MAXNUM, 10 },
				{ MAXNUM, MAXNUM, 20, 0, 60 },
				{ MAXNUM, MAXNUM, MAXNUM, MAXNUM, 0 } };
		Graph g = new Graph(n, edge);

		g.ShortestPath(5, 0);

		float[] dist = g.getDist();
		for (int i = 0; i < n; i++) {
			System.out.print(dist[i] + " "); // 输出到给顶点的最短路径长度
		}
		System.out.println("");

		// 读取从源点0到终点4的最短路径
		int[] ph = g.getPath();
		int len = ph.length;
		System.out.println(len);
		Stack sk = new Stack();
		int idx = ph[4];
		sk.push(4);
		if (idx > 0) {
			sk.push(idx);
		}
		while (idx >= 0 && ph[idx] != 0) {
			idx = ph[idx];
			if (idx > 0) {
				sk.push(idx);
			}
		}
		sk.push(0);

		while (!sk.isEmpty()) {
			Integer p = (Integer) sk.pop();
			System.out.print(p + " "); // 输出源点0到终点4的最短路径
		}
	}

	private int numVertices; // 图的最大定点个数
	private float[][] edge; // 图的邻接矩阵
	private float[] dist; // 存放从顶点0到其他各顶点的最短路径长度
	private int[] path; // 存放在最短路径上该顶点的前一顶点的顶点号
	private int[] S; // 已求得的在最短路径上的顶点的定点号

	public Graph(int _numVertices, float[][] _edge) {
		numVertices = _numVertices;
		edge = _edge;
		dist = new float[numVertices];
		path = new int[numVertices];
		S = new int[numVertices];
	}

	/**
	 * dist[j], 0<=j<n,是当前求到的从顶点v到顶点j的最短路径长度; path[j], 0<=j<n,存放求到的最短路径
	 * 
	 * @param n
	 * @param v
	 */
	public void ShortestPath(int n, int v) {
		for (int i = 0; i < n; i++) { // dist和path数组初始化
			dist[i] = edge[v][i]; // 邻接矩阵第v行元素复制到dist中
			S[i] = 0; // 已求出最短路径的顶点集合初始化
			if (i != v && dist[i] < MAXNUM) {
				path[i] = v;
			} else {
				path[i] = -1; // 路径存放数组初始化
			}
		}

		S[v] = 1; // 顶点v加入顶点集合
		dist[v] = 0;
		for (int i = 0; i < n - 1; i++) { // 从顶点v确定n-1条路径
			float min = MAXNUM;
			int u = v;
			for (int j = 0; j < n; j++) { // 选择当前不在集合S中具有最短路径的顶点u
				if (S[j] == 0 && dist[j] < min) {
					u = j;
					min = dist[j];
				}
			}

			S[u] = 1; // 将顶点u加入集合S,表示它已在最短路径上
			for (int w = 0; w < n; w++) { // 修改
				if (S[w] == 0 && (edge[u][w] < MAXNUM)
						&& (dist[u] + edge[u][w] < dist[w])) {
					dist[w] = dist[u] + edge[u][w];
					path[w] = u;
				}
			}
		}
	}

	/**
	 * 获得顶点表
	 * 
	 * @return
	 */
	public int getNumVertices() {
		return numVertices;
	}

	/**
	 * 获得邻接矩阵
	 * 
	 * @return
	 */
	public float[][] getEdge() {
		return edge;
	}

	/**
	 * dist[j], 0<=j<n,是当前求到的从顶点v到顶点j的最短路径长度;
	 * 
	 * @return
	 */
	public float[] getDist() {
		return dist;
	}

	/**
	 * path[j], 0<=j<n,存放求到的最短路径
	 * 
	 * @return
	 */
	public int[] getPath() {
		return path;
	}

	/**
	 * 已求得的在最短路径上的顶点的定点号
	 * 
	 * @return
	 */
	public int[] getS() {
		return S;
	}

}
1
2
分享到:
评论

相关推荐

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

    1. 问题描述:求网(带权有向图)中从一个顶点到其余各顶点间的最短路径。 2. 实验原理:贪心算法原理。 3. 实验内容:使用贪心算法解决单源最短路径问题,并通过本例熟悉贪心算法在程序设计中的应用方法。 4. 实验...

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

    单源最短路径问题可以描述为:给定一个带权有向图 G=(V,E),其中每条边都有一个非负的权值 c[i,j],从一个顶点(源点)到达其他所有顶点的最短路径问题。该问题的目的是找到从源点出发到达其他所有结点的最短路径...

    vc关于单源最短路径(图)

    单源最短路径问题是指在一个带有权重(通常为非负)的有向图或无向图中找到从一个指定顶点到所有其他顶点的最短路径的问题。这个问题在很多实际应用中都有广泛的应用,比如网络路由、地图导航等。 ### 2. 关键概念...

    带权图求最短路径课程设计报告

    【带权图求最短路径课程设计报告】的目的是通过编程实现从给定的源点到图中所有其他顶点的最短路径。这个任务主要分为两个关键部分:使用邻接表表示图以及运用狄克斯特拉算法求解最短路径。 首先,我们需要了解**...

    单源最短路径

    给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数。另外,还给定 V 中的一个顶点,称为源。现在我们要计算从源到所有其他各顶点的最短路径长度。这里的长度是指路上各边权之和。这个问题通常称为单源最短...

    图的遍历,最小生成树,单源最短路径

    图 5.1 遍历:深度优先搜索、广度优先...5.3 有向图单源最短路径: Dijkstra算法(要求所有权值非负):算法给定一个源点,每次从剩余顶点中选择具有最短路径估计的顶点u,将其加入集合S,并对u的所有出边进行松弛。

    Dijkstra算法寻找最短路径的完整源代码

    "Dijkstra算法寻找最短路径的完整源代码" 本资源提供了Dijkstra算法寻找最短路径的完整源代码,同时附带了Kruskal最小生成树算法。该程序提供了输入输出的完整控制台程序,能够帮助用户快速了解和应用Dijkstra算法...

    图的最短路径-dijkstra算法.ppt

    Dijkstra算法是一种常用的单源最短路径算法,用于解决带权有向图中的最短路径问题。 单源最短路径问题 单源最短路径问题是指从给定的源顶点s到其它顶点v的权最小路径。该问题可以形式化地描述为:给定一个带权有向...

    C++计算任意权值的单源最短路径(Bellman-Ford)

    本文主要介绍了C++计算任意权值的单源最短路径,通过Bellman-Ford算法实现带有负权值的有向图的最短路径计算。该算法的思路是通过relaxation的方法,逐步更新距离信息,直到所有节点的最短路径都被计算出来为止。 ...

    17 7 图5-最短路径1

    在有向图中,路径的方向很重要,因为从一个顶点到另一个顶点可能没有直接的路径。单源最短路径问题是指从图中的一个特定顶点(源点)出发,找到到所有其他顶点的最短路径。这里的“最短”指的是路径上的边的权值之和...

    最短路径算法及应用.pdf

    - **单源最短路径问题**:给定一个带权重的有向图\( G = (V, E, W) \),其中\( V \)为顶点集,\( E \)为有向边集,\( W \)为边上的权集。问题的目标是从一个特定的起点\( S \)到图中每个其他顶点的最短路径。 #### ...

    数据结构6.7最短路径

    最短路径问题是图论中的一个经典问题,其基本概念涉及到有向图或无向图中,从某一顶点到另一顶点或多个顶点之间经过的路径总权值最小的路径。在图论中,路径上的权值可以是边的长度、时间或其他度量,而权值最小的...

    计算机算法实验报告

    已知一个n结点有向图G=(V,E)和边的权函数c(e),求由G中某指定结点v0到其它各结点的最短路径。假定边的权值为正。 2、文件k路归并问题: 将记录长度分别为X1,X2,X3…Xn的n个文件归并为一个文件。每次归并k个文件,...

    基于Dijsktra算法的最短路径求解_C语言_Dijsktra_

    对于有向图,矩阵是对称的,表示从一个顶点到另一个顶点的边的权重。在C语言中,可以使用二维数组来表示邻接矩阵。 2. **创建图的算法** 在C语言中,创建邻接矩阵通常涉及以下步骤: - 定义一个二维数组,大小为...

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

    在有向图中,邻接矩阵通常是不对称的,因此只需要存储入边的权值。 2. 单源最短路径: 迪杰斯特拉算法是一种贪心算法,它通过逐步扩展已知最短路径来找到从源点到所有其他顶点的最短路径。算法的核心是维护一个...

    091-Bellman-Ford.cs

    贝尔曼·福特(Bellman Ford)算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法。该算法由 Richard Bellman 和 Lester Ford 分别发表于 1958 年和 1956 年,而实际上 Edward...

    数据结构 图最短路径PPT学习教案.pptx

    本PPT学习教案主要讲解了如何求解带权有向图中最短路径的问题。 首先,图中的顶点代表城市,边则表示城市之间的交通联系。边上的权值可以理解为这段路线的长度、时间消耗或费用。最短路径是指从源点(起始城市)...

    图的遍历、最短路径、最小生成树

    图的遍历、最短路径和最小生成树是图论中的经典问题,它们在很多领域如网络设计、路由算法、社交网络分析等都有广泛应用。下面我们将深入探讨这些概念。 首先,**图的遍历** 是指在图中按照特定顺序访问每个顶点的...

    dijkstra最短路径算法--算法论文

    * 可以解决带权有向图中的最短路径问题 * 可以应用于解决实际中的各种最短路径问题 Dijkstra算法的缺点是: * 不适用于解决带负权值的图 * 不适用于解决有负权值的最短路径问题 * 时间复杂度较高,需要进行多次...

Global site tag (gtag.js) - Google Analytics