Java实现Dijkstra算法
来源:互联网 发布:js if else 简写 编辑:程序博客网 时间:2024/05/16 15:38
迪杰斯特拉(Dijkstra)算法思想
按路径长度递增次序产生最短路径算法:
把结点V分成两组:
(1)S:已求出最短路径的顶点的集合
(2)V-S=T:尚未确定最短路径的顶点集合
将T中顶点按最短路径递增的次序加入到S中.
保证:
(1)从源点V0到S中各顶点的最短路径长度都不大于从V0到T中任何顶点的最短路径长度
(2)每个顶点对应一个距离值
S中顶点:从V0到此顶点的最短路径长度
T中顶点:从V0到此顶点的只包括S中顶点作中间顶点的最短路径长度
import java.util.*;public class Main { private int numNode; //结点的个数 private int[][] matrix; //存放结点之间的权值 private int startVertex; //开始结点 private int[] distance; //存放开始结点到其他结点的最短距离 private int[] preVertex; //存放路径的前一个结点 public Main(int[][] matrix,int numNode,int startVertex) { this.matrix = matrix; this.numNode = numNode; this.startVertex = startVertex; distance = new int[numNode]; preVertex = new int[numNode]; } public void Dijstra(){ //创建一个数组,用来标记结点是否已经在集合S中 boolean[] isInS = new boolean[numNode]; //初始化distance和preVertex for(int i =0;i<numNode;i++){ distance[i] = matrix[startVertex][i]; if(matrix[startVertex][i]<Integer.MAX_VALUE){ preVertex[i] = startVertex; } else preVertex[i] = -1; //-1表示该结点的前一结点尚未找到或者没有前一结点 } preVertex[startVertex] = -1; //先把开始结点加入集合S中 isInS[startVertex] = true; //nextVertex表示下一个最新加入S中的结点,该结点到开始结点的距离在非集合S中是最小的 int nextVertex = startVertex; for(int i =0;i<numNode;i++){ int tmMinDistance = Integer.MAX_VALUE; //找到不在S中且到开始结点的距离最小的结点,tmMinDistance表示开始结点到结点nextVertex的最小值 for(int j = 0;j<numNode;j++){ if(isInS[j]==false && distance[j]<tmMinDistance){ nextVertex = j; tmMinDistance = distance[j]; } } isInS[nextVertex] = true; //更新开始结点到其他结点的距离 for(int j = 0;j<numNode;j++){ if(isInS[j]==false && matrix[nextVertex][j]<Integer.MAX_VALUE){ int temp = matrix[nextVertex][j]+tmMinDistance; if(temp<distance[j]){ distance[j] = temp; preVertex[j] = nextVertex; } } } } } public void print(){ for(int i =0;i<numNode;i++){ int index = i ; Stack<Integer> trace = new Stack<Integer>(); while(preVertex[index]!=-1){ trace.push(preVertex[index]); index = preVertex[index]; } System.out.print("Path: "); while(!trace.empty()){ System.out.print(trace.pop()+" --> "); } System.out.print(""+i); System.out.println(" Distance: "+distance[i]); } } public static void main(String[] args) { final int INT_MAX = Integer.MAX_VALUE; int graph[][] = { {INT_MAX,INT_MAX,INT_MAX,INT_MAX,2,5}, {INT_MAX,INT_MAX,5,INT_MAX,4,INT_MAX}, {INT_MAX,INT_MAX,INT_MAX,2,INT_MAX,INT_MAX}, {5,INT_MAX,INT_MAX,INT_MAX,INT_MAX,4}, {INT_MAX,INT_MAX,6,2,INT_MAX,INT_MAX}, {INT_MAX,4,3,INT_MAX,INT_MAX,INT_MAX} }; Main gr = new Main(graph, 6, 1); gr.Dijstra(); gr.print(); }}
输出:
Path: 1 –> 4 –> 3 –> 0 Distance: 11
Path: 1 Distance: 2147483647
Path: 1 –> 2 Distance: 5
Path: 1 –> 4 –> 3 Distance: 6
Path: 1 –> 4 Distance: 4
Path: 1 –> 4 –> 3 –> 5 Distance: 10
1 0
- Dijkstra算法 ---java实现
- dijkstra算法JAVA实现
- Java实现Dijkstra算法
- DIJKSTRA算法-java实现
- Dijkstra算法Java实现
- Dijkstra算法java实现
- Dijkstra算法java实现
- dijkstra算法java实现
- Dijkstra 算法 Java实现
- dijkstra算法JAVA实现
- Dijkstra算法JAVA实现
- Dijkstra算法Java实现
- Java 实现Dijkstra(迪杰斯特拉)算法
- Dijkstra算法的Java实现
- Dijkstra算法的Java实现
- Dijkstra算法(Java实现)
- Dijkstra算法的java实现
- dijkstra算法的java实现
- android LayoutInflater的两种用法
- SDOI2009晨跑题解
- js 中 ==与===区别(两个等号与三个等号)
- 接口的成员特点
- (4.1.18.5)Android Service学习之AIDL, Parcelable和远程服务
- Java实现Dijkstra算法
- 初学echarts的excel数据导入遇到的小问题
- PHP 5.5 新特性
- 程序闪退
- DP背包基础
- Combination Sum II
- CSS中IE6下双边距BUG解决方案
- 无线网络覆盖
- boost asio socket