最短路径Dijkstra算法(JAVA)

原创 2009年05月29日 16:23:00

 

  

 

/*

 * Graph.java

 */

class Vertex {

     public char label;

     public boolean isInTree;

     public Vertex(char label) {

         this.label = label;

         isInTree = false;

     }

}

//sPath[]用来存储父节点和距离。

class DistPare {

     public int parentVertex;

     public int distance;

     public DistPare(int parentVertex, int distance) {

         this.parentVertex = parentVertex;

         this.distance = distance;

     }

}

public class Graph {

     private final int MAX_VERTEX = 20;

     private final int INFINITY = 999999;

     private int nVerts;

     private int nTree;

     private int currentVertex;

     private int startToCurrent;

     private int adjMatrix[][];

     private Vertex vertexList[];

     private DistPare sPath[];

    

     public Graph() {

         adjMatrix = new int[MAX_VERTEX][MAX_VERTEX];

         vertexList = new Vertex[MAX_VERTEX];

         sPath = new DistPare[MAX_VERTEX];

         nVerts = 0;

         nTree = 0;

         for(int i=0; i<MAX_VERTEX; i++)

              for(int j=0; j<MAX_VERTEX; j++)

                   adjMatrix[i][j] = INFINITY;

     }

     public void addVertex(char label) {

         vertexList[nVerts++] = new Vertex(label);

     }

     //有向图

     public void addOneEdge(int start, int end, int weight) {

         adjMatrix[start][end] = weight ;

     }

     public void dijkstra() {

         int startTree = 0;

         vertexList[startTree].isInTree = true;

         nTree = 1;

         for(int j=0; j<nVerts; j++) {

              int tempDist = adjMatrix[startTree][j];

              sPath[j] = new DistPare(startTree, tempDist);

         }

         while(nTree<nVerts) {

              int indexMin = getMin();

              int minDist = sPath[indexMin].distance;

              if(minDist == INFINITY) {

                   System.out.println("有无法到达的顶点");

              }

              else {

                   currentVertex = indexMin;

                   startToCurrent = sPath[indexMin].distance;

              }

              vertexList[currentVertex].isInTree = true;

              nTree ++;

              adjust_sPath();

         }

         displaypaths();

     }

    

     private void displaypaths() {

         for(int j=0; j<nVerts; j++) {

              System.out.print(vertexList[j].label + "=");

              if(sPath[j].distance == INFINITY)

                   System.out.print("inf");

              else

                   System.out.print(sPath[j].distance);

              char parent = vertexList[sPath[j].parentVertex].label;

              System.out.print("(" + parent + ") ");

         }

         System.out.println(" ");

     }

    

     private void adjust_sPath() {

         int column = 1;

         while(column < nVerts) {

              if(vertexList[column].isInTree) {

                   column ++;

                   continue;

              }

              int currentToFringe = adjMatrix[currentVertex][column];

              int startToFringe = startToCurrent + currentToFringe;

              int sPathDist = sPath[column].distance;

              if(startToFringe<sPathDist) {

                   sPath[column].parentVertex = currentVertex;

                   sPath[column].distance = startToFringe;

              }

              column ++;

         }

     }

    

     private int getMin() {

         int minDist = INFINITY;

         int indexMin = 0;

         for(int j=0; j<nVerts; j++) {

              if(!vertexList[j].isInTree && sPath[j].distance<minDist) {

                   minDist = sPath[j].distance;

                   indexMin = j;

              }

         }

         return indexMin;

     }

    

}

/*

 * Dijkstra.java

 */

public class Dijkstra {

     public static void main(String[] args) {

         Graph theGraph = new Graph();

         theGraph.addVertex('A');//0

         theGraph.addVertex('B');//1

         theGraph.addVertex('C');//2

         theGraph.addVertex('D');//3

         theGraph.addVertex('E');//4

 

         theGraph.addOneEdge(0, 1, 50);//AB 50

         theGraph.addOneEdge(0, 3, 80);//AD 80

         theGraph.addOneEdge(1, 2, 60);//BC 60

         theGraph.addOneEdge(1, 3, 90);//BD 90

         theGraph.addOneEdge(2, 4, 40);//CE 40

         theGraph.addOneEdge(3, 2, 20);//DC 20

         theGraph.addOneEdge(3, 4, 70);//DE 70

         theGraph.addOneEdge(4, 1, 50);//EF 50

        

         System.out.println("Dijkstra: ");

         theGraph.dijkstra();

     }

 

}

 

 

单元Dijkstra算法求最短路径的的Java实现

上一篇写了无权值的最短路径的求法,是利用广度优先搜索的方法使用队列实现的,当有权值时,我们通常使用Dijkstra算法来求解最短路径的问题,这里我们假设所有的权值都是正值。 首先,在节点类改变了权值的...
  • qq_20991785
  • qq_20991785
  • 2015年03月17日 11:08
  • 865

单源最短路径( Dijkstra算法)JAVA实现

单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。在弄清楚如何求算单源最短路径问题之前,必须弄清楚最短路径的最优子结构性质。 一.最短路径的最优子结构性质    该性质描述为...
  • gloria0610
  • gloria0610
  • 2014年04月15日 10:40
  • 4967

Dijkstra 最短路径算法的一种高效率实现

关键词 最短路径算法;网络分析;地理信息系统分类号 P208;O22  An Efficient Implementation of Shortest Path AlgorithmYue Yang G...
  • qsd007
  • qsd007
  • 2007年04月01日 20:51
  • 1970

最短路径的Dijkstra算法(邻接表)

描述     以邻接表作为存储结构实现,求解从给定源点到给定结束点的最短路径。   输入 从1开始表示第一个节点。 第一行输入:顶点数n(2 第二行输入有向边:起始点s1,结束点 s2,边权值 w ...
  • axiqia
  • axiqia
  • 2016年03月25日 22:38
  • 6107

(ACM)Dijkstra最短路径算法

1  最短路径算法  在日常生活中,我们如果需要常常往返A地区和B地区之间,我们最希望知道的可能是从A地区到B地区间的众多路径中,那一条路径的路途最短。最短路径问题是图论研究中的一个经典算法问题, ...
  • u012860063
  • u012860063
  • 2014年02月22日 09:19
  • 2589

通俗算法讲解之图最短路径——Dijkstra算法

Dijkstra算法计算单源有向正权值图最短路径计算
  • qq_26849233
  • qq_26849233
  • 2016年10月27日 19:05
  • 810

最短路径 输出路径 Dijkstra算法

某个源点到其余各顶点的最短路径 这个算法最开始心里怕怕的,不知道为什么,花了好长时间弄懂了,也写了一遍,又遇到时还是出错了,今天再次写它,心里没那么怕了,耐心研究,懂了之后会好开心的,哈哈Dijkst...
  • qq_36183935
  • qq_36183935
  • 2017年04月03日 20:38
  • 1952

经典算法——迪杰斯特拉(Dijkstra)最短路径

基本思想迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点...
  • hezhangping
  • hezhangping
  • 2016年08月27日 15:30
  • 2331

获取多条最短路径的Dijkstra算法

学习Dijkstra算法,并扩展成可以获取所有最短路径
  • u013615687
  • u013615687
  • 2017年04月04日 14:43
  • 1148

经典算法之图的最短路径(一):Dijkstra算法

Dijkstra算法可以说基本上每一本有讲到图的最短路径的书上都会有的一个算法,但基本上都是讲原理和伪代码,今天自己用Java代码给实现了一下,记录在此。 Dijkstra算法只是解决某些图的最短路径...
  • silent_strings
  • silent_strings
  • 2015年09月01日 15:50
  • 2813
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最短路径Dijkstra算法(JAVA)
举报原因:
原因补充:

(最多只允许输入30个字)