Dijkstra算法
2015-09-26 01:33
323 查看
package dijkstra; /** * 顶点 * @author victor * */ public class Point { public Point(String id) { this.id = id; } public String getId() { return id; } public void setId(String id) { this.id = id; } @Override public String toString() { return id; } @Override public int hashCode() { return id.hashCode(); } @Override public boolean equals(Object obj) { if (!(obj instanceof Point)) { return false; } else { return ((Point) obj).id.equals(id); } } private String id; }
package dijkstra; /** * 边界 * @author victor * */ public class Border { public Border(Point a, Point b) { this.a = a; this.b = b; } @Override public int hashCode() { return a.hashCode() + b.hashCode(); } @Override public boolean equals(Object obj) { if (!(obj instanceof Border)) { return false; } else { Border border = (Border) obj; return border.a.equals(a) && border.b.equals(b); } } @Override public String toString() { return "<" + a.toString() + "," + b.toString() + ">"; } public Point getA() { return a; } public void setA(Point a) { this.a = a; } public Point getB() { return b; } public void setB(Point b) { this.b = b; } private Point a; private Point b; }
package dijkstra; import java.util.HashMap; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * Dijkstar * @author victor * */ public class Dijkstra { public static void main(String[] args) { List<Point> points = new ArrayList<>(); for (int i = 0; i < 6; i++) { char[] chars = {(char) ('A' + i)}; points.add(new Point(new String(chars))); } List<Border> borders = new ArrayList<>(); Map<Border, Integer> weights = new HashMap<>(); borders.add(new Border(points.get(0), points.get(1))); borders.add(new Border(points.get(1), points.get(0))); weights.put(borders.get(0), 6); weights.put(borders.get(1), 6); borders.add(new Border(points.get(0), points.get(2))); borders.add(new Border(points.get(2), points.get(0))); weights.put(borders.get(2), 3); weights.put(borders.get(3), 3); borders.add(new Border(points.get(2), points.get(1))); borders.add(new Border(points.get(1), points.get(2))); weights.put(borders.get(4), 2); weights.put(borders.get(5), 2); borders.add(new Border(points.get(2), points.get(4))); borders.add(new Border(points.get(4), points.get(2))); weights.put(borders.get(6), 4); weights.put(borders.get(7), 4); borders.add(new Border(points.get(2), points.get(3))); borders.add(new Border(points.get(3), points.get(2))); weights.put(borders.get(8), 3); weights.put(borders.get(9), 3); borders.add(new Border(points.get(1), points.get(3))); borders.add(new Border(points.get(3), points.get(1))); weights.put(borders.get(10), 5); weights.put(borders.get(11), 5); borders.add(new Border(points.get(3), points.get(4))); borders.add(new Border(points.get(4), points.get(3))); weights.put(borders.get(12), 2); weights.put(borders.get(13), 2); borders.add(new Border(points.get(3), points.get(5))); borders.add(new Border(points.get(5), points.get(3))); weights.put(borders.get(14), 3); weights.put(borders.get(15), 3); borders.add(new Border(points.get(4), points.get(5))); borders.add(new Border(points.get(5), points.get(4))); weights.put(borders.get(16), 5); weights.put(borders.get(17), 5); mid(points, borders, weights); System.out.println(minRoutes); } public static void mid(List<Point> points, List<Border> borders, Map<Border, Integer> weights) { Point zeroPoint = points.get(0); minRoutes.put(new Border(zeroPoint, zeroPoint), 0); List<Point> selectedPoints = new ArrayList<>(); selectedPoints.add(zeroPoint); points = points.subList(1, points.size()); // initialization for (Border border : borders) { Point a = border.getA(); Point b = border.getB(); assemblePointLinkers(a, b, pointLinkers); } Point head = null; for (; points.size() > 0; points.remove(0)) { head = points.get(0); List<Point> linkersOfHead = pointLinkers.get(head); List<Point> selectedLinkersOfHead = new ArrayList<>(); for (Point point : linkersOfHead) { if (selectedPoints.contains(point)) { selectedLinkersOfHead.add(point); } } Border newMinBorderForHead = new Border(zeroPoint, head); int value = 0; boolean unassigned = true; for (Point point : selectedLinkersOfHead) { int min = minRoutes.get(new Border(zeroPoint, point)) + weights.get(new Border(point, head)); if (unassigned) { value = min; unassigned = false; } else { value = value > min ? min : value; } } minRoutes.put(newMinBorderForHead, value); selectedPoints.add(head); } } private static void assemblePointLinkers(Point a, Point b, Map<Point, List<Point>> pointLinkers) { if (!pointLinkers.containsKey(a)) { List<Point> lists = new ArrayList<>(); lists.add(b); pointLinkers.put(a, lists); } else { List<Point> lists = pointLinkers.get(a); lists.add(b); } } private static Map<Point, List<Point>> pointLinkers = new HashMap<>(); private static Map<Border, Integer> minRoutes = new HashMap<>(); }
相关文章推荐
- 软件设计师&产品经理应常去的网站
- C++ | 段错误
- c++设计模式----迭代器模式iterator
- Cocos2d-x Lua 初步
- 为什么会有缓冲区溢出攻击专栏
- 《幸运大转盘》代码分享
- awakeFromNib与viewDidLoad的区别
- hdoj5120Intersection【求圆相交的面积】
- 3个线程顺序打印ABC10次
- POJ 2311 Cutting Game
- 链表的多项式加法链表的多项式加法
- Eclipse中servlet显示无法导入javax.servlet包问题的解决方案
- 进程与线程的区别与联系
- eclipse中server location灰色,如何修改?
- 2013 Asia Regional Changchun
- UVa1149 - Bin Packing
- C++ | RAII 机制
- [贪心算法]UVa1610 - Party Games
- docker 获取容器获取的时间不是本地时间,解决办法
- 初识JavaScript———JavaScript注意事项(1)