JAVA实现DIJKSTRA算法

import java.util.Queue;
import java.util.LinkedList;

public class dijkstra{
  public static void main(String args[]){
    System.out.println("dijkstra algo");
    /*construct the adjacent table begin*/
      Node n0 = new Node(0);
      Node n1 = new Node(1);
      Node n2 = new Node(2);
      Node n3 = new Node(3);
      Node n4 = new Node(4);
      Node n5 = new Node(5);
      AdjNode n0n1 = new AdjNode(7,n1);
      AdjNode n0n2 = new AdjNode(9,n2);
      AdjNode n0n5 = new AdjNode(14,n5);

      AdjNode n1n0 = new AdjNode(7,n0);
      AdjNode n1n2 = new AdjNode(10,n2);
      AdjNode n1n3 = new AdjNode(15,n3);

      AdjNode n2n0 = new AdjNode(9,n0);
      AdjNode n2n5 = new AdjNode(2,n5);
      AdjNode n2n3 = new AdjNode(11,n3);

      AdjNode n3n1 = new AdjNode(15,n1);
      AdjNode n3n2 = new AdjNode(11,n2);
      AdjNode n3n4 = new AdjNode(6,n4);

      AdjNode n4n3 = new AdjNode(6,n3);
      AdjNode n4n5 = new AdjNode(9,n5);

      AdjNode n5n4 = new AdjNode(9,n4);
      AdjNode n5n2 = new AdjNode(2,n2);
      AdjNode n5n0 = new AdjNode(14,n0);

      AdjNode[] n0adj = {n0n1,n0n2,n0n5};
      AdjNode[] n1adj = {n1n0,n1n2,n1n3};
      AdjNode[] n2adj = {n2n0,n2n5,n2n3};
      AdjNode[] n3adj = {n3n1,n3n2,n3n4};
      AdjNode[] n4adj = {n4n3,n4n5};
      AdjNode[] n5adj = {n5n4,n5n2,n5n0};
      n0.addAdjNodes(n0adj);
      n1.addAdjNodes(n1adj);
      n2.addAdjNodes(n2adj);
      n3.addAdjNodes(n3adj);
      n4.addAdjNodes(n4adj);
      n5.addAdjNodes(n5adj);
      /*construct the adjacent table end*/
      Node[] G = {n0,n1,n2,n3,n4,n5};

      Queue<Node> queue = new LinkedList<Node>();
      AdjNode[] currAdjNodes;
      n0.color = 1;
      n0.vt++;
      n0.setShortestPathLen(0);
      queue.offer(n0);
      Node currNode = queue.poll();
    while(currNode != null){
        currAdjNodes = currNode.getAllAdjNodes();

        for(int i=0;i<currAdjNodes.length;i++){
            if(currAdjNodes[i].adjNode.getShortestPathLen() > (currNode.getShortestPathLen()+currAdjNodes[i].weight)){
                  currAdjNodes[i].adjNode.setShortestPathLen(currNode.getShortestPathLen()+currAdjNodes[i].weight);
                  currAdjNodes[i].adjNode.setPreNode(currNode);
            }
          if(currAdjNodes[i].adjNode.color == 0){
            currAdjNodes[i].adjNode.color = 1;
            currAdjNodes[i].adjNode.vt++;
            queue.offer(currAdjNodes[i].adjNode);
          }
        }

        currNode.color = 2;
      currNode = queue.poll();
    }

    for(int i=0;i<G.length;i++){
      System.out.println("shortest path of " + i + "node:" + G[i].getShortestPathLen()+" vt:"+G[i].vt);
    }
  }
}
public class Node{
  private int index = 0,shortestPathLen = 10000;
  private Node preNode = null;
  private AdjNode[] nodeArray;
  public int color = 0;
  public int vt = 0;
  public Node(int ind){
    index = ind;
  }

  public void addAdjNodes(AdjNode[] nodes){
    nodeArray = nodes;
  }

  public AdjNode[] getAllAdjNodes(){
    return nodeArray;
  }

  public void setPreNode(Node n){
    preNode = n;
  }

  public void setShortestPathLen(int len){
    shortestPathLen = len;
  }

  public int getShortestPathLen(){
    return shortestPathLen;
  }
}
public class AdjNode{
  int weight = 0;
  Node adjNode = null;
  public AdjNode(int w,Node n){
    adjNode = n;
    weight = w;
  }
}
时间: 2024-10-13 21:36:49

JAVA实现DIJKSTRA算法的相关文章

JAVA实践Dijkstra算法求最短路径距离

前言 Dijkstra算法用于求指定顶点到其他顶点的最短距离,时间复杂度O(N^2),据说可以使用堆优化到O(log N),然而还不会. 其特点是(对我来说)非常容易求得路径,和对应的距离. 缺陷也是存在的,此算法不能处理负权边.即距离为负时,就挂了. 此文内容同样参考<啊哈,算法> 另外个人感觉代码可能有错,还望有心人指点. 功能实现 输入一个顶点 输出路径 输出与路径对应的距离 如果存在不可到达的顶点,则输出该顶点不可到达 中文版参考 对应的二维数组 {0, 1, 12, INF, INF

Java实现Dijkstra算法求最短路径

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

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

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

Dijkstra算法(三)之 Java详解

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

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实现

缘来是你: 前几天在博客园里,有小伙伴贴出华为2010年10K(薪资)员工3级晋级试题. 问题主要是算法实现. 在师兄大批入住华为的环境下,作为一名热爱算法的小伙伴,也想小试一下身手. 问题地址:http://www.cnblogs.com/preacher/p/4126261.html 在解决上述问题前先来复习一下基础知识: Dijkstra最短路径算法 上述问题放在下一期随笔上 算法简析: Dijkstra算法又称为单源最短路径,所谓单源是在一个有向图中,从一个顶点出发,求该顶点至所有可到达