`
ql213
  • 浏览: 11462 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

贪心策略之求解单源最短路径-Dijkstra算法

阅读更多

对于单源最短路径问题,可以利用贪心策略求解,其经典算法便是Dijkstra算法。首先找出与v0点最邻近点的最短路径,然后找出与v0点第二近顶点的最短路径,直到找到最后一个点与v0的最短路径。

 

实现Dijkstra算法可以和prim算法类似,需要构造2个集合s1,s2。其中s1是当前搜索到的最短路径顶点集,s2是剩下的带求解的点集。每一次搜索都会将s2中的点与最后加入到s1的点进行权值更新操作,一旦发现有s1到s2的更短的路径,就更新目前的距离集合,并且将最短距离对应的那个点加入到s1中,并从s2中删除。

 

Dijkstra算法的时间复杂度是O(n^2)。

 

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

/**
 * 单源最短路径的Dijkstra算法实现
 * @author ql_math
 *
 */
public class DijkstraShortestPath {
	
	/**最短路径的连接*/
	private double[] shortestPathArray;
	
	private int pointsNum;

	
	/**
	 * Dijkstra算法计算单源最短路径
	 * @param pIndex
	 * @param graphicArray
	 * @return
	 */
	public double[] calculateShortestPath(int pIndex, double[][] graphicArray)
	{
		SimpleGraphics graph=new SimpleGraphics(graphicArray);
		pointsNum=graph.getPSize();//顶点数目
		
		List<Integer> curFoundList=new LinkedList<Integer>();//当前找到的点集合
		curFoundList.add(pIndex);
		
		List<Integer> midList=new LinkedList<Integer>();//待查找点集
		
		shortestPathArray=new double[pointsNum];//获得与当前点连接的点集合
		initShortestPath(midList,pIndex);//待查找点集

		int set_num=1;
		while(set_num<=pointsNum)
		{
			int cur_shortest_index=calculateP2PShortestPath(graph,curFoundList,midList);//找出与当前点连接的点距最小值的点
			
			curFoundList.add(cur_shortest_index);
			midList.remove(new Integer(cur_shortest_index));

			set_num++;
		}
		
		return shortestPathArray;
	}

	private int calculateP2PShortestPath(SimpleGraphics graph, List<Integer> curFoundList, List<Integer> midList) {
		int compareNode=((LinkedList<Integer>)curFoundList).getLast();
		double[] array=graph.getAdjacencyPoints(compareNode);
		double min=Double.MAX_VALUE;
		int index=0;	

		for(int i=0;i<pointsNum;i++)
		{
			double newLen=shortestPathArray[compareNode]+array[i];
			
			if(newLen<shortestPathArray[i]&&midList.contains(i))
				shortestPathArray[i]=newLen;
		}

		for(int i=0;i<pointsNum;i++)
		{
			if(shortestPathArray[i]<min&&midList.contains(i))
			{
				index=i;
				min=shortestPathArray[i];
			}
		}
		return index;
	}


	/**
	 * 初始化
	 * @param n
	 * @param index
	 */
	private void initShortestPath(List<Integer> list, int index) {
		
		for(int i=0;i<pointsNum;i++)
		{
			if(i!=index)
			{
				list.add(i);
				shortestPathArray[i]=Double.MAX_VALUE;
			}

		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		DijkstraShortestPath dj=new DijkstraShortestPath();
		double[][] graphicArray={{0,1,6,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE},
				{1,0,3,4,6,Double.MAX_VALUE},{6,3,0,2,2,Double.MAX_VALUE},
				{Double.MAX_VALUE,4,2,0,2,3},{Double.MAX_VALUE,6,2,2,0,4},{Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,3,4,0}};
		System.out.println("最短路径:"+Arrays.toString(dj.calculateShortestPath(0,graphicArray)));

	}

}
 

 

 

 

0
2
分享到:
评论

相关推荐

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

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

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

    Dijkstra算法是一种贪心算法,用于解决单源最短路径问题。其基本思想是将图中所有顶点分成两组:S和V-S,其中S是包括已确定最短路径的顶点的集合,V-S是尚未确定的最短路径的顶点集。初始时,S仅包含源v0,不断在V-S...

    贪心算法 Dijkstra 单源最短路径

    用C++实现的贪心算法 Dijkstra 单源最短路径,并包含大量的注释,对理解程序很有帮助

    最短路径算法Dijkstra源代码

    Dijkstra算法的核心思想是贪心策略,它每次选择当前未访问顶点中距离起点最近的一个,并更新与它相邻的顶点的距离。 源代码实现通常包括以下关键步骤: 1. 初始化:设置一个起点,将所有顶点的距离初始化为无穷大...

    单源最短路径vc源码(贪心算法)

    Dijkstra算法是最常用的求解单源最短路径的贪心算法之一,由荷兰计算机科学家艾兹格·迪科斯彻于1956年提出。这个算法适用于加权有向图或无向图,其基本思想是每次扩展最短路径树,将当前未访问且与已访问节点距离...

    最短路径 Dijkstra算法C语言实现

    本设计以VC++6.0作为程序开发环境,C语言作为程序开发语言,详细介绍了最短路径的求解算法及其...请用C/C++语言的结构体、指针、数据结构等基础知识,编写程序实现图的结构定义、图的存储,以及求解单源点最短路径。

    单源最短路径(算法 代码)

    它使用贪心策略,每次选取当前未访问节点中最短路径的节点进行扩展,直到到达目标节点或遍历完所有节点。Dijkstra算法保证找到的路径是全局最优的,但不能处理负权边。 2. **Bellman-Ford算法**:由理查德·贝尔曼...

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

    这个C程序展示了如何利用Dijkstra算法求解单源点最短路径问题,但需要注意的是,该算法并不适用于存在负权重边的图,因为贪心策略在这种情况下可能无法得到全局最优解。对于存在负权重的图,可以考虑使用其他算法,...

    最短路课件 求单源最短路径

    在计算机科学领域,尤其是图论和算法设计中,求解单源最短路径问题是一项基本任务。这通常涉及在一个加权图中找到从一个特定顶点(源节点)到所有其他顶点的最短路径。这个问题在路由、物流、网络优化等实际场景中有...

    最短路径的 dijkstra算法

    总结来说,Dijkstra算法是一种用于求解单源最短路径问题的有效方法,它通过贪心策略逐步扩展最短路径,适用于无负权边的图。在实际编程实现中,需要考虑优化数据结构以提高效率,如使用优先队列。理解并熟练运用...

    求单源最短路径的C++语言程序

    ### 单源最短路径算法实现 #### 一、引言 在计算机科学与图论领域,单源最短路径问题是指在一个加权图中找到从一个特定顶点(源点)到所有其他顶点的最短路径的问题。这类问题在实际应用中非常常见,例如在地图导航...

    最短路径-Dijkstra-欧洲旅行(详细分析+代码注释)

    总的来说,Dijkstra算法是一种高效的求解单源最短路径问题的方法。在处理大型网络数据时,如欧洲铁路系统,它能快速找出两点间最经济的旅行路线。理解并掌握这种算法,对于解决现实世界中的许多问题都至关重要。

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

    Dijkstra算法是图论中应用最广的算法之一,广泛应用于解决最短路径问题。在该算法中,我们可以将问题转换为图论问题,然后使用Dijkstra算法来求解。该算法的基本思路是按照源点s到其他各个顶点的最短路径的递增顺序...

    求单源最短路径—Dijkstra算法实验报告.doc

    "单源最短路径—Dijkstra算法实验报告" 本实验报告的目的是为了了解贪心算法的基本要素,掌握Dijkstra...本实验通过了Dijkstra算法实现单源最短路径的求解,掌握了贪心算法的基本要素,了解了单源最短路径问题的思想。

    单源最短路径

    - 实现`Dijkstra`函数,该函数采用贪心策略逐步构建最短路径树。 - 编写辅助函数,如`ppath`用于打印路径等。 - 主函数中读取用户输入的图信息,并调用`Dijkstra`函数计算最短路径。 3. **测试阶段**:编写测试...

    课程设计-单源最短路径.rar

    1. **Dijkstra算法**:由荷兰计算机科学家艾兹格·迪科斯彻于1956年提出,是最著名的单源最短路径算法之一。它通过贪心策略,每次选取当前未访问节点中最短路径的节点进行扩展,直到找到所有节点的最短路径。...

    最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(CC++)

    Dijkstra算法的核心思想是贪心策略,即每次都选取当前未处理节点中距离起点最近的一个节点,将其最短路径确定下来,并根据这个节点更新与其相邻节点的最短路径。这个过程持续进行,直到所有的节点都被处理,最终得到...

    最短路径(单源多源等形式).rar

    另外,"最短路径(单源dijkstra+binary_heap正向表.txt"和"最短路径(单源dijkstra邻接阵形式).txt"则可能包含Dijkstra算法与二叉堆的实现,二叉堆是另一种常用的优先队列实现方式,常见于标准库中。 2. Floyd-...

    java单源最短路径源程序文件

    3. **Dijkstra算法**:Dijkstra算法是最常用的解决单源最短路径问题的算法,由Edsger W. Dijkstra提出。它通过维护一个优先队列,逐步找到从源点到各个顶点的最短路径。每次从队列中取出距离源点最近的顶点,并更新...

Global site tag (gtag.js) - Google Analytics