`
狂盗一枝梅
  • 浏览: 14074 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

【数据结构】【图论】【最短路径】Dijkstra算法

阅读更多

一、核心思想

       和Prime算法的思想几乎相同,Prime算法中是使用lowcost数组保存到生成树之间的最短距离,Dijkstra算法中使用lowcost数组保存到第一个节点的最短路径。

二、和Prime算法的不同之处

       Dijkstra算法和Prime算法相似度达到了99%,和Prime算法相比,Dijkstra算法有以下几点不同之处:

       1. 最大的不同之处是lowcost数组的刷新方式不同,Prime算法的刷新方式:

 

for(int j=1;j<=nodeCount;j++){
      if(lowcost[j]!=-1&&lowcost[j]>map[k][j]){
            lowcost[j]=map[k][j];
      }
}

        Dijkstra算法的刷新方式:

for(int j=1;j<=nodeCount;j++){
	if(visited[j]==false&&lowcost[j]>(map[j][k]+minEdge)){
		lowcost[j]=map[j][k]+minEdge;
	}
}

 

        2.使用Prime算法可以使用lowcost数组作为标志数组,可以使用lowcost[i]=-1来标识当前节点已经加入生成树,但是在Dijkstra算法中该lowcost数组保存着到节点一的最短路径值,所以必须重新定义一个标识数组visited来标识一个节点是否已经被访问过(可以在Prime算法中使用该数组,那么Dijkstra算法和Prime算法只有1中的不同之处了)

        3.由于刷新lowcost数组的方式发生了改变,导致作为“无限大”标识的maxIntegerValue不能再使用(1<<31)-1,可以使用(1<<15)-1作为标志性的”无限大“

三、代码实现(Java版)

import java.util.Scanner;

public class Dijkstra
{
	private static final int maxIntegerValue=(1<<15)-1;
	public static void main(String args[]){
		Scanner scanner=new Scanner(System.in);
		int[][] map=new int[101][101];
		boolean[] visited=new boolean[101];
		while(scanner.hasNext()){
			init(map,visited);
			int nodeCount=scanner.nextInt();
			int edgeCount=scanner.nextInt();
			for(int i=0;i<edgeCount;i++){
				int node1=scanner.nextInt();
				int node2=scanner.nextInt();
				int edgeValue=scanner.nextInt();
				if(map[node1][node2]>edgeValue){
					map[node1][node2]=edgeValue;
					map[node2][node1]=edgeValue;
				}
			}
			int shortestPathCost=dijkstra(nodeCount,map,visited);
			System.out.println(shortestPathCost);
		}
	}
	public static int dijkstra(int nodeCount,int[][] map,boolean[] visited){
		int lowcost[]=new int[101];
		lowcost[1]=0;
		visited[1]=true;
		for(int i=2;i<=nodeCount;i++){
			lowcost[i]=map[1][i];
		}
		for(int i=1;i<=nodeCount-1;i++){
			int minEdge=maxIntegerValue;
			int k=0;
			for(int j=1;j<=nodeCount;j++){
				if(visited[j]==false&&lowcost[j]<minEdge){
					k=j;
					minEdge=lowcost[j];
				}
			}
			visited[k]=true;
			for(int j=1;j<=nodeCount;j++){
				if(visited[j]==false&&lowcost[j]>(map[j][k]+minEdge)){
					lowcost[j]=map[j][k]+minEdge;
				}
			}
		}
		return lowcost[nodeCount];
	}
	public static void init(int[][] map,boolean[] visited){
		for(int i=0;i<map.length;i++){
			for(int j=0;j<map[i].length;j++){
				map[i][j]=maxIntegerValue;
			}
		}
		for(int i=0;i<visited.length;i++){
			visited[i]=false;
		}
	}
}

 四、测试数据

输入
6 10
1 2 6
2 5 3
5 6 6
6 4 2
4 1 5
3 1 1
3 2 5
3 5 6
3 6 4
3 4 5

输出
5

 五、ACM

题目链接:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2143

AC代码:

import java.util.Scanner;

public class Main
{
	private static final int maxIntegerValue=(1<<15)-1;
	public static void main(String args[]){
		Scanner scanner=new Scanner(System.in);
		int[][] map=new int[101][101];
		boolean[] visited=new boolean[101];
		while(scanner.hasNext()){
			init(map,visited);
			int nodeCount=scanner.nextInt();
			int edgeCount=scanner.nextInt();
			for(int i=0;i<edgeCount;i++){
				int node1=scanner.nextInt();
				int node2=scanner.nextInt();
				int edgeValue=scanner.nextInt();
				if(map[node1][node2]>edgeValue){
					map[node1][node2]=edgeValue;
					map[node2][node1]=edgeValue;
				}
			}
			int shortestPathCost=dijkstra(nodeCount,map,visited);
			System.out.println(shortestPathCost);
		}
	}
	public static int dijkstra(int nodeCount,int[][] map,boolean[] visited){
		int lowcost[]=new int[101];
		lowcost[1]=0;
		visited[1]=true;
		for(int i=2;i<=nodeCount;i++){
			lowcost[i]=map[1][i];
		}
		for(int i=1;i<=nodeCount-1;i++){
			int minEdge=maxIntegerValue;
			int k=0;
			for(int j=1;j<=nodeCount;j++){
				if(visited[j]==false&&lowcost[j]<minEdge){
					k=j;
					minEdge=lowcost[j];
				}
			}
			visited[k]=true;
			for(int j=1;j<=nodeCount;j++){
				if(visited[j]==false&&lowcost[j]>(map[j][k]+minEdge)){
					lowcost[j]=map[j][k]+minEdge;
				}
			}
		}
		return lowcost[nodeCount];
	}
	public static void init(int[][] map,boolean[] visited){
		for(int i=0;i<map.length;i++){
			for(int j=0;j<map[i].length;j++){
				map[i][j]=maxIntegerValue;
			}
		}
		for(int i=0;i<visited.length;i++){
			visited[i]=false;
		}
	}
}
/*

*/ 



/**************************************
	Problem id	: SDUT OJ 2143 
	User name	: kdyzm 
	Result		: Accepted 
	Take Memory	: 90280K 
	Take Time	: 590MS 
	Submit Time	: 2016-01-24 13:49:42  
**************************************/

 

分享到:
评论

相关推荐

    数据结构课程设计 校园导游 图论 Dijkstra算法 Floyd算法

    包含一个主程序和15个分程序,使用X-mind画出的烟台大学的平面图和数据结构课程设计最终版实验报告。(主要内容都在报告里,包括项目描述、数据和逻辑结构分析、存储结构分析、主要算法及其复杂度分析、程序实现和...

    试设计一个算法,求图中一个源点到其他各顶点的最短路径

    试设计一个算法,求图中一个源点到其他各顶点的最短路径。 (1)用邻接表表示图; (2)按长度非递减次序打印输出最短路径的长度及相应路径。

    Dijkstra算法单源路径

    Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的...

    Dijkstra算法原理及实现

    Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度...

    Dijkstra(迪杰斯特拉)算法模板

    Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的...

    公交线路最短路径查询

    最短路径问题是图论中的一个经典问题,其中的Dijkstra算法一直被认为是图论中的好算法,但有的时候需要适当的调整Dijkstra算法才能完成多种不同的优化路径的查询。 对于某城市的公交线路,乘坐公交的顾客希望在这样...

    堆优化dijkstra.cpp

    堆优化dijkstra算法。使用邻接表。邻接表的应用案例。...Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。

    图的最短路径、拓扑排序

    数据结构中的 ,狄克斯特拉(Dijkstra),弗洛伊德求最短路径的算法,和拓扑排序的算法,这里讲的十分的详述,而且还有模板语言实现。

    迪杰斯特拉求最短路径问题

    迪杰斯特拉算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。...Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。

    图的Dijkstra算法

    Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于...Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。

    基于Dijkstra算法的公交线路上优化路径的查询+图形化界面

    最短路径问题是图论中的一个经典问题,其中的Dijkstra算法一直被认为是图论中的好算法,但有的时候需要适当的调整Dijkstra 算法才能完成多种不同的优化路径的查询。 对于某城市的公交线路,乘坐公交的顾客希望在这样...

    迪杰斯特拉算法MATLAB仿真

    Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的...

    091-Bellman-Ford.cs

    C#,图论与图算法,有向图单源最短路径的贝尔曼·福特(Bellman Ford)算法与源代码 贝尔曼·福特(Bellman Ford)算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法。该算法...

    基础的数据结构与算法以及一些算法题.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    数据结构与排序算法------通过代码示例,讲解:数据结构和9种排序算法。.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    数据结构与算法分析第二版 ---C语言描述(附加答案)

    不相交集ADT8.1 等价关系8.2 动态等价性问题8.3 基本数据结构8.4 灵巧求并算法8.5 路径压缩8.6 按秩求并和路径压缩的最坏情形8.6.1 Union/Find算法分析8.7 一个应用总结练习参考文献第9章 图论算法9.1 若干定义9.1.1...

    恋上数据结构系列,数据结构与算法.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    数据结构与算法分析

     9.3.2 Dijkstra算法   9.3.3 具有负边值的图   9.3.4 无环图   9.3.5 所有顶点对的最短路径   9.3.6 最短路径举例   9.4 网络流问题   9.5 最小生成树   9.5.1 Prim算法   9.5.2...

    尚硅谷Java数据结构与java算法(Java数据结构与算法).zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

Global site tag (gtag.js) - Google Analytics