代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
Java
】
单源最短路径算法,Dijkstra算法
作者:
/ 发布于
2016/11/8
/
410
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<Integer, Integer> thisPointMap = new TreeMap<Integer, Integer>();// 该点到各点的距离。 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> point_arr = new ArrayList<Point>();// 存储点集合 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<Point> 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<Point> 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; } }
试试其它关键字
同语言下
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
可能有用的
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
贡献的其它代码
Label
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3