(HW)Dijkstra算法(Java)

  1 import java.util.Comparator;
  2 import java.util.HashMap;
  3 import java.util.LinkedList;
  4 import java.util.List;
  5 import java.util.Map;
  6 import java.util.PriorityQueue;
  7 import java.util.Stack;
  8
  9 public class test
 10 {
 11     public static void main(String[] args)
 12     {
 13         Graph g = new Graph();
 14         Dijkstra(g, g.s);
 15 //        print_Path(g, g.s, g.t);
 16         Stack<Vertex> stack1 = new Stack<>();
 17         Vertex a1 = g.x;
 18         while(a1 != null)
 19         {
 20             stack1.push(a1);
 21             a1 = a1.predecessor;
 22         }
 23         System.out.println("s 至 x 的最短路径为");
 24         while(!stack1.isEmpty())
 25             System.out.print(stack1.pop().name + " ");
 26         System.out.print("\n" + "路径长度为 " + "\n" + g.x.d);
 27     }
 28
 29     public static void Dijkstra(Graph g, Vertex s)  //时间复杂度: O(elogv)
 30     {
 31         PriorityQueue<Vertex> queue = new PriorityQueue<>(new Comparator<Vertex>()
 32         {
 33             public int compare(Vertex o1, Vertex o2)
 34             {
 35                 return o1.d - o2.d;
 36             }
 37         });
 38         s.d = 0;
 39         Vertex u;
 40         queue.add(s);
 41         queue.add(g.t);
 42         queue.add(g.x);
 43         queue.add(g.y);
 44         queue.add(g.z);
 45         while(!queue.isEmpty())
 46         {
 47             u = queue.poll();
 48             u.isvisited = true;
 49             for(Edge e : g.adjacencyMap.get(u))  //O(elogv)
 50                 if(e.dst.isvisited == false)
 51                 {
 52                     relax(e.dst, u, e);
 53                     queue.remove(e.dst);  //最小堆化 O(logv)
 54                     queue.add(e.dst);
 55                 }
 56         }
 57     }
 58
 59     public static void relax(Vertex i, Vertex j, Edge e)
 60     {
 61         if(i.d > j.d + e.weight)
 62         {
 63             i.d = j.d + e.weight;
 64             i.predecessor = j;
 65         }
 66     }
 67
 68 //    递归打印最短路径
 69 //    public static void print_Path(Graph g, Vertex src, Vertex dst)
 70 //    {
 71 //        if(dst == src)
 72 //        {
 73 //            System.out.print(src.name + " ");
 74 //            return;
 75 //        }
 76 //
 77 //        print_Path(g, src, dst.predecessor);
 78 //        System.out.print(dst.name + " ");
 79 //    }
 80 }
 81
 82 class Vertex
 83 {
 84     String name;
 85     int d;
 86     Vertex predecessor;
 87     boolean isvisited;
 88
 89     public Vertex(String name)
 90     {
 91         this.name = name;
 92         this.d = Integer.MAX_VALUE;
 93         this.predecessor = null;
 94         this.isvisited = false;
 95     }
 96 }
 97
 98 class Edge
 99 {
100     Vertex src;  //起点
101     Vertex dst;  //终点
102     int weight;  //权重
103
104     public Edge(Vertex src, Vertex dst, int weight)
105     {
106         this.src = src;
107         this.dst = dst;
108         this.weight = weight;
109     }
110 }
111
112 class Graph
113 {
114     Vertex s, t, y, x, z;
115     Map<Vertex, List<Edge>> adjacencyMap;
116
117     public Graph()
118     {
119         this.adjacencyMap = new HashMap<>();
120         s = new Vertex("s");
121         t = new Vertex("t");
122         y = new Vertex("y");
123         x = new Vertex("x");
124         z = new Vertex("z");
125
126         //s的邻接边
127         List<Edge> sN = new LinkedList<>();
128         Edge st = new Edge(s, t, 10);
129         Edge sy = new Edge(s, y, 5);
130         sN.add(st);
131         sN.add(sy);
132         adjacencyMap.put(s, sN);
133
134         //t的邻接边
135         List<Edge> tN = new LinkedList<>();
136         Edge ty = new Edge(t, y, 2);
137         Edge tx = new Edge(t, x, 1);
138         tN.add(ty);
139         tN.add(tx);
140         adjacencyMap.put(t, tN);
141
142         //y的邻接边
143         List<Edge> yN = new LinkedList<>();
144         Edge yt = new Edge(y, t, 3);
145         Edge yx = new Edge(y, x, 9);
146         Edge yz = new Edge(y, z, 2);
147         yN.add(yt);
148         yN.add(yx);
149         yN.add(yz);
150         adjacencyMap.put(y, yN);
151
152         //x的邻接边
153         List<Edge> xN = new LinkedList<>();
154         Edge xz = new Edge(x, z, 4);
155         xN.add(xz);
156         adjacencyMap.put(x, xN);
157
158         //z的邻接边
159         List<Edge> zN = new LinkedList<>();
160         Edge zs = new Edge(z, s, 7);
161         Edge zx = new Edge(z, x, 6);
162         zN.add(zs);
163         zN.add(zx);
164         adjacencyMap.put(z, zN);
165     }
166 }

原文地址:https://www.cnblogs.com/Huayra/p/10886894.html

时间: 2024-10-15 21:25:06

(HW)Dijkstra算法(Java)的相关文章

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

从最短路径开始,学习Dijstar算法 下面是求最短路径问题描述: 下面是Dijkstar算法的描述: 下面是使用Dijkstar算法求解右图中的问题: 下面是图的邻接矩阵: 下面是计算过程: 下面是求解最短路径: 下面是Java代码实现,其中需要注意的问题我已经标出(一定要细心!!!!): package greedy_algorithm; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSe

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

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

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

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