package org.dijkstra;
import java.util.Arrays;
/**
* 迪杰斯特拉-邮差邮寄最短路径问题
* @author cjj_1
* @date 2020-09-10 15:41
*/
public class DijkstraDemo {
public static void main(String[] args) {
char[] chars={
'A','B','C','D','E','F','G'};
final int N = 65535;
int[][] matrix = {
{
N,5,7,N,N,N,2},
{
5,N,N,9,N,N,3},
{
7,N,N,N,8,N,N},
{
N,9,N,N,N,4,N},
{
N,N,8,N,N,5,4},
{
N,N,N,4,5,N,6},
{
2,3,N,N,4,6,N}
};
Graph graph = new Graph(chars,matrix);
graph.dijkstra(chars.length,6);
}
}
/**
* 节点关系类
*/
class VertexsRelation{
int[] pre_visited;//节点是否被访问过 下标标表示节点 1表示访问过 0表示没有被访问过
int[] pre_previous;//节点的前驱,下标标表示节点,对值表示前驱节点,初始化为-1
int[] dis;//表示与目标节点的最短距离
int length ;
//初始化
public VertexsRelation(int length,int index){
pre_visited = new int[length];
pre_previous = new int[length];
dis = new int[length];
this.length = length;
for (int i=0;i<length;i++){
pre_previous[i]=-1;
if(i==index){
dis[i]=0;
}else {
dis[i] = 65565;
}
}
}
/**
* 更新j节点的前驱是 index
* @param index
* @param j
*/
public void updatePrevious(int index,int j){
pre_previous[j]= index;
}
/**
* 更新index 节点被访问过
* @param index
*/
public void updateIsvisited(int index){
pre_visited[index] =1;
}
/**
* index 被访问过返回true,否则返回false
* @param index
* @return
*/
public boolean isvisited(int index){
return pre_visited[index]==1;
}
}
class Graph{
char[] vertexs;
int[][] matrix;
VertexsRelation vr;
/**
* 初始化 图的基本数据
* @param vertexs
* @param matrix
*/
public Graph(char[] vertexs,int[][] matrix){
this.vertexs = vertexs;
this.matrix = matrix;
}
/**
* 迪捷斯卡尔算法
* @param length
* @param index
*/
public void dijkstra(int length,int index){
vr = new VertexsRelation(length,index);
int index1 = updateDis(index);
for(int j =1;j<length;j++){
index1 = updateDis(index1);
}
for(int i=0;i<vr.dis.length;i++){
System.out.print(vertexs[i]+"最短距离:"+vr.dis[i]+"; ");
}
System.out.println();
for(int i=0;i<vr.pre_previous.length;i++){
System.out.print(vertexs[i]+"前驱节点:"+vr.pre_previous[i]+"; ");
}
}
public int updateDis(int index) {
int min = 65565;
int dis;
int min_index = -1;
vr.pre_visited[index] =1;
for(int i =0;i<vr.dis.length;i++){
if(!vr.isvisited(i)) {
dis = vr.dis[index] + matrix[index][i];
if(vr.dis[i]>dis){
vr.dis[i] = dis;
vr.pre_previous[i]=index;
}
if (min >vr.dis[i]) {
min = vr.dis[i];
min_index = i;
}
}
}
return min_index;s
}
/**
* 打印图
*/
public void print(){
for (int i =0;i<matrix.length;i++){
System.out.print(Arrays.toString(matrix[i]));
}
System.out.println();
}
}
Problema de Dijkstra
Supongo que te gusta
Origin blog.csdn.net/weixin_40128696/article/details/108573193
Recomendado
Clasificación