【图算法】狄克斯特拉算法Java实现
2017-11-12 21:31
423 查看
package cn.zhaoyuening.algorithms.dijkstra; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; class Vertex{ private String name; private Map<Vertex, Integer> adjMap = new HashMap<>(); public Vertex(String name){ this.name = name; } public String getName() { return name; } public Vertex setName(String name) { this.name = name; return this; } public Integer getValByVertex(Vertex vertex) { return adjMap.get(vertex); } public Vertex addAdj(Vertex v, Integer val) { adjMap.put(v, val); return this; } public Set<Vertex> getAdjSet() { return adjMap.keySet(); } @Override public String toString() { return this.name; } } public class Dijkstra { private Map<Vertex, Integer> valMap; private Set<Vertex> handledVertex; public Integer miniVal(Vertex startVertex, Vertex endVertex) { valMap = new HashMap<Vertex, Integer>(); valMap.put(startVertex, 0); handledVertex = new HashSet<>(); Vertex tmpVertex = startVertex; Set<Vertex> adjSet = null; while (tmpVertex != null) { handledVertex.add(tmpVertex); adjSet = tmpVertex.getAdjSet(); for (Vertex v : adjSet) { updateValMap(v, valMap.get(tmpVertex)+tmpVertex.getValByVertex(v)); // 找下个最小距离点 } tmpVertex = findMiniValVertex(); } return valMap.get(endVertex); } public Vertex findMiniValVertex() { Vertex miniVertex = null; Integer miniVal = Integer.MAX_VALUE; int tmpVal = 0; for (Vertex v : valMap.keySet()) { if (handledVertex.contains(v)) { continue; } tmpVal = valMap.get(v); if (miniVal > tmpVal) { miniVal = tmpVal; miniVertex = v; } } return miniVertex; } public boolean updateValMap(Vertex vertex,Integer val) { if (!valMap.containsKey(vertex)||val < valMap.get(vertex)) { valMap.put(vertex, val); return true; } return false; } public static void main(String[] args) { Vertex s = new Vertex("S"); Vertex a = new Vertex("A"); Vertex b = new Vertex("B"); Vertex e = new Vertex("E"); s.addAdj(a, 6); s.addAdj(b, 2); b.addAdj(a, 3); a.addAdj(e, 1); Dijkstra dijkstra = new Dijkstra(); Integer val = dijkstra.miniVal(s, e); System.out.println(val); } }
相关文章推荐
- 用Java实现多线程服务器程序
- 利用Java实现串口全双工通讯
- 在Java applet中如何实现一个模式对话框?
- 用 Java 实现回调例程
- 利用Java实现网络通信
- Java Tip: 实现Command模式
- 在java中实现对FORM的打印功能
- 如何在Java应用程序中实现copy图像功能。
- Java图形设计中,利用Bresenham算法实现直线线型,线宽的控制(NO 2D GRAPHICS)
- 从一个ConnectionPool的实现看design pattern的运用 (source code for Java 1.1)
- 用Java实现的设计模式系列(1)-Factory
- dom规范和java中的实现(三)
- dom规范和java中的实现(二)
- IBM Java Jvm GC实现内幕
- 在 Windows 中实现 Java 本地方法
- 使用Java实现数据报通讯过程
- http断点续传简单实现(java)
- Java.NET --一个基于Java的Microsoft.NET框架的实现
- 用JAVA实现Undo、Redo,Copy、Paste、Cut
- 用Java实现Web服务器 HTTP协议