博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用java编写的单源最短路径算法,Dijkstra算法
阅读量:4072 次
发布时间:2019-05-25

本文共 3840 字,大约阅读时间需要 12 分钟。

package test;    import java.util.TreeMap;  import java.util.ArrayList;  import java.io.BufferedReader;  import java.io.InputStreamReader;  import java.io.IOException;    class Point {      private int id;// 点的id      private boolean flag = false;// 标志是否被遍历      int sum;// 记录总的点个数        private TreeMap
thisPointMap = new TreeMap
();// 该点到各点的距离。 BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); Point(int sum) { // 构造函数 带有顶点个数 this.sum = sum; } public void setId(int id) {// 设置顶点id this.id = id; } public int getId() {// 获得顶点id return this.id; } public void changeFlag() {// 修改访问状态。 this.flag = true; } public boolean isVisit() {// 查看访问状态 return flag; } public void setLenToOther()throws IOException{// 初始化改点到各顶点的距离。 System.out.println("=======请输入顶点" + (this.id + 1) + "至其他各顶点的边距======="); for (int i = 0; i < sum; i++) { if (i == this.id) thisPointMap.put(this.id, 0); else { System.out.print("至 顶点" + (i + 1) + " 的距离 :"); boolean flag =true; int len = 0; while(flag){ try { len = Integer.valueOf(bufr.readLine()); flag = false; } catch (NumberFormatException e) { System.out.print("输入有误,请重新输入:"); } }; thisPointMap.put(i, len); } } } // 该点到顶尖id的 距离。 public int lenToPointId(int id) { return thisPointMap.get(id); } } class Dijkstra { public static void main(String[] args)throws IOException { ArrayList
point_arr = new ArrayList
();// 存储点集合 BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); System.out.print("请输入顶点个数: "); int sum = 0; boolean flag =true; while(flag){ try { sum = Integer.valueOf(bufr.readLine()); flag = false; } catch (NumberFormatException e) { System.out.print("输入有误,请重新输入:"); } }; for (int i = 0; i < sum; i++) {// 初始化 Point p = new Point(sum); p.setId(i); p.setLenToOther(); point_arr.add(p); } System.out.print("请输入起始顶点 id :"); boolean flag2 =true; int start = 0; while(flag2){ try { start = Integer.valueOf(bufr.readLine())-1; if(start > sum-1 || start < 0) throw new NumberFormatException(); flag2 = false; }catch (NumberFormatException e) { System.out.print("输入有误,请重新输入:"); } }; showDijkstra(point_arr, start);// 单源最短路径遍历 } public static void showDijkstra(ArrayList
arr, int i) { System.out.print("顶点" + (i + 1)); arr.get(i).changeFlag(); Point p1 = getTopointMin(arr, arr.get(i)); if (p1 == null) return; int id = p1.getId(); showDijkstra(arr, id); } public static Point getTopointMin(ArrayList
arr, Point p) { Point temp = null; int minLen = Integer.MAX_VALUE; for (int i = 0; i < arr.size(); i++) { // 当已访问 或 者是自身或者无该路径时跳过。 if (arr.get(i).isVisit() || arr.get(i).getId() == p.getId() || p.lenToPointId(i) < 0) continue; else { if (p.lenToPointId(i) < minLen) { minLen = p.lenToPointId(i); temp = arr.get(i); } } } if (temp == null) return temp; else System.out.print(" @--" + minLen + "--> "); return temp; } }

转载地址:http://ykkni.baihongyu.com/

你可能感兴趣的文章
大数据入门:Java和Scala编程对比
查看>>
大数据入门:Scala函数式编程
查看>>
【数据结构周周练】002顺序表与链表
查看>>
C++报错:C4700:使用了非初始化的局部变量
查看>>
【数据结构周周练】003顺序栈与链栈
查看>>
C++类、结构体、函数、变量等命名规则详解
查看>>
C++ goto语句详解
查看>>
【数据结构周周练】008 二叉树的链式创建及测试
查看>>
《软件体系结构》 第九章 软件体系结构评估
查看>>
《软件体系结构》 第十章 软件产品线体系结构
查看>>
《软件过程管理》 第六章 软件过程的项目管理
查看>>
《软件过程管理》 第九章 软件过程的评估和改进
查看>>
分治法 动态规划法 贪心法 回溯法 小结
查看>>
《软件体系结构》 练习题
查看>>
《数据库系统概论》 第一章 绪论
查看>>
《数据库系统概论》 第二章 关系数据库
查看>>
《数据库系统概论》 第三章 关系数据库标准语言SQL
查看>>
SQL语句(二)查询语句
查看>>
SQL语句(六) 自主存取控制
查看>>
《计算机网络》第五章 运输层 ——TCP和UDP 可靠传输原理 TCP流量控制 拥塞控制 连接管理
查看>>