Dijkstra算法应用之Java实现

缘来是你:

前几天在博客园里,有小伙伴贴出华为2010年10K(薪资)员工3级晋级试题。

问题主要是算法实现。

在师兄大批入住华为的环境下,作为一名热爱算法的小伙伴,也想小试一下身手。

问题地址:http://www.cnblogs.com/preacher/p/4126261.html

在解决上述问题前先来复习一下基础知识: Dijkstra最短路径算法

上述问题放在下一期随笔上

算法简析:

Dijkstra算法又称为单源最短路径,所谓单源是在一个有向图中,从一个顶点出发,求该顶点至所有可到达顶点的最短路径问题。 
      设G=(V,E)是一个有向图,V表示顶点,E表示边。它的每一条边(i,j)属于E,都有一个非负权W(I,j),在G中指定一个结点v0,要求把从v0到G的每一个接vj(vj属于V)的最短有向路径找出来(或者指出不存在)。
      Dijstra算法是运用贪心的策略,从源点开始,不断地通过相联通的点找出到其他点的最短距离
基本思想是:
      设置一个顶点的集合s,并不断地扩充这个集合,一个顶点属于集合s当且仅当从源点到该点的路径已求出。开始时s中仅有源点,并且调整非s中点的最短路径长度,找当前最短路径点,将其加入到集合s,直到终点在s中。
基本步骤:
1、把所有结点分成两组:
      第一组:包括已经确定最短路径的结点;
      第二组:包括尚未确定最短路径的结点。
2、开始时,第一组只包含起点,第二组包含剩余的点;
3、用贪心的策略,按最短路径长度递增的顺序把第二组的结点加到第一组去,直到v0可达的所有结点都包含于第一组中。在这个过程中,不断更新最短路径,总保持从v0到第一组各结点的最短路径长度dist都不大于从v0到第二组任何结点的路径长度。
4、每个结点对应一个距离值,第一组结点对应的距离就是v0到此结点的最短路径长度,第二组结点对应的距离值就是v0由第一组结点到此结点的最短路径长度。
5、直到所有的顶点都扫描完毕(v0可达的所有结点都包含于第一组中),找到v0到其它各点的所有最短路径。

动画演示:http://www.jcc.jx.cn/kejiandb/Dijkstra.swf

代码实现:

  1 import java.util.Scanner;
  2
  3
  4 public class DijkstraAl {
  5
  6
  7     public static void main(String argv[] ){
  8
  9     int k=0; int j=0;
 10     Scanner br=new Scanner(System.in);
 11     System.out.println("Please input the stations(int):");
 12     j=Integer.parseInt(br.nextLine());
 13     System.out.println("Please input the roads:(int):");
 14     k=Integer.parseInt(br.nextLine());
 15     System.out.println("Please input the rodas like‘1 2 3‘: from 1 station to 2 station length 3.");
 16     String Sourcedata =br.nextLine();
 17     String data[]=Sourcedata.split(" ");
 18     br.close();
 19     int s[][];
 20     s=new int[j][];
 21     for(int i=0;i<j;i++){
 22         s[i]=new int[j];
 23     }
 24     for(int i=0;i<j;i++){
 25         for(int p=0;p<j;p++){
 26             s[i][p]=10000;
 27             if(i==p)
 28                 s[i][p]=0;
 29         }
 30     }
 31     for(int i=0;i<3*k;i=i+3){
 32         int m=Integer.parseInt(data[i]);
 33         int n=Integer.parseInt(data[i+1]);
 34         s[m-1][n-1]=Integer.parseInt(data[i+2]);                    //实现的是无向图
 35         s[n-1][m-1]=Integer.parseInt(data[i+2]);
 36     }
 37     /*for(int i=0;i<j;i++){
 38         for(int p=0;p<j;p++){
 39             System.out.print(s[i][p]+" ");
 40             if(s[i][p]!=10000)
 41                 System.out.print("   ");
 42         }
 43         System.out.println();
 44     }*/
 45
 46  distr(s, 0, j);
 47
 48 }
 49
 50     public static void distr(int[][] data, int j, int n){
 51
 52          int[] Shortl,Chang; String[] route;
 53          Chang=new int[n];          //记录需经过的station数
 54          Shortl=new int[n];         //记录最短路径的长度
 55          route=new String[n];       //记录最短路径的route stations
 56          for(int i=0;i<n;i++){
 57              route[i]="";
 58              Shortl[i]=data[j][i];
 59              if(Shortl[i]>0&&Shortl[i]!=10000)
 60              { route[i]=route[i]+" "+i;
 61                  Chang[i]=1;        }
 62              else
 63                  Chang[i]=0;
 64
 65          }
 66
 67          for(int i=0;i<n;i++){
 68
 69             // System.out.println("The xunhuan time i:"+i);
 70              for(int t=0;t<n;t++){
 71
 72                 // System.out.println("The xunhuan time t:"+t);
 73                 // System.out.println("The xunhuan time Shortl[t]:"+Shortl[t]);
 74                  if(Shortl[t]!=10000){
 75                     // System.out.println("The xunhuan time Shortl[t]:"+Shortl[t]);
 76                      for(int m=0;m<n;m++){
 77                         // System.out.println("The xunhuan time m and data[t][m]:"+m+" "+data[t][m]);
 78                          if(!(data[t][m]==10000)){
 79                             // System.out.println("The xunhuan time m and data[t][m]:"+data[t][m]+Shortl[t]+Shortl[m]);
 80                                  if((data[t][m]+Shortl[t]) < Shortl[m]){
 81                                      Shortl[m]=data[t][m]+Shortl[t];
 82                                      Chang[m]=Chang[t]+1;
 83                                      route[m]=route[t]+" "+m;
 84                                     // System.out.println("Change :"+Shortl[t]);
 85                                      break;
 86                                  }
 87                          }
 88                  }
 89
 90              }
 91         }
 92
 93
 94     }
 95            for(int u=0;u<n;u++){
 96              System.out.println("The shortest route from 0 address to "+u+" address :"+Shortl[u]);
 97              System.out.println("The stations:"+Chang[u]);
 98              System.out.println("The routes:"+j+route[u]);
 99             }
100 }
101 }

实现演示:

时间: 2024-07-31 18:29:55

Dijkstra算法应用之Java实现的相关文章

Dijkstra算法(三)之 Java详解

前面分别通过C和C++实现了迪杰斯特拉算法,本文介绍迪杰斯特拉算法的Java实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想

Dijkstra算法求最短路径(java)(转)

原文链接:Dijkstra算法求最短路径(java) 任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表方式用OPEN,CLOSE表的方式,其采用的是贪心法的算法策略,大概过程如下:1.声明两个集合,open和close

Dijkstra算法 java实现

/* * 设置一个U集合,包含最小路径长度和上一个结点 * V-U集合表示还没有进行调整 * 把V-U集合逐渐加入U中,并调整最小路径 * */ public class Dijkstra { private static int MAX = 10000; public static void dijkstra(GraphMatrix grap, Path dist[]){ // 初始化V0 init(grap,dist); int n = dist.length; int minw = MAX

基于无向图且权重单一的最短路径Dijkstra算法——JAVA实现

做一个无向图的权重单一的最短路径算法. 模拟停车场最近车位的选择. 首先参考了博友JavaMan_chen的博文 http://blog.csdn.net/javaman_chen/article/details/8254309 但是这个算法是有问题的. 算法中,如果A点是当前点,是选取距离A点权重最小的那一点作为下一个路径点的. 这就带来了一个问题,即,距离A点的2个点如果权重相同,那就会随机选取其中一条. 于是,在数据量稍微大点的时候,就出错了. 在这里使用Dijkstra算法使用的是用OP

最短路径算法之Dijkstra算法(java实现)

前言 Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知识准备: 1.表示图的数据结构 用于存储图的数据结构有多种,本算法中笔者使用的是邻接矩阵.  图的邻接矩阵存储方式是用两个数组来表示图.一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息. 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 从上面可以看出,无向图的边

Dijkstra算法java现实

先上一张路径图 一共有8个点,每个点之间的连线数字,表示这两个点之间的距离,如果两个点之间无直接连线,那么只能通过其它点到达. Dijkstra算法,网上有逼格较高的定义,描述文字不是太通俗,且不管它. 下面就以求A到G的最短路径为例,谈一下具体的算法实现思路: 前提条件:定义一个close集合,分析过的点都放入此集合中,A为起点,首先放入集合. 1.以A为起点,首先寻找离A最近的相连的某个点(上图是C点) 2.找到这个C点后,循环C相连的所有点(其实B和D),重新计算A到B,A到D的临时最短距

最短路径——dijkstra算法(Java)

在刷题的过程中常常会遇到求最短路径的问题,在求无权图的问题中我们常常使用BFS来求其最短路径,而BFS无法解决网(有权图)中的问题,我们解决网中的最短路径常常使用dijkstra算法来求解. dijkstra算法是一种贪心的思想,具体其正确性的证明,这里就不再赘述.下面来直接讲解如何使用dijkstra算法: 1.我们在使用dijkstra算法时为了其编写的便捷性一般使用邻接矩阵来描述一个图.并将邻接矩阵中每个元素的值初始化为无穷大(或者很大很大的值).之后根据图中的结构加入数字,称这个矩阵为E

Java数据结构 最短路径解法Dijkstra算法

本文为博主原创文章,未经博主允许不得转载! 1.1.定义概览Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.注意该算法要求图中不存在负权边. 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径.(

Dijkstra算法之 Java详解

原文引自:http://www.cnblogs.com/skywang12345/p/3711516.html 迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是