(HW)Dijkstra算法(Java)
Posted huayra
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(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 }
以上是关于(HW)Dijkstra算法(Java)的主要内容,如果未能解决你的问题,请参考以下文章
java利用迪克斯特拉(Dijkstra)算法求拓扑关系最短路径
java利用迪克斯特拉(Dijkstra)算法求拓扑关系最短路径