用java编写的一个迪杰斯特拉算法(单源最短路径算法,Dijkstra算法)。
可以用于有向图和无向图。用负数表示该有向路不通。在EditPlus上写的,所以就一个.java文件。
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;// 点的idprivate 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) {// 设置顶点idthis.id = id;}public int getId() {// 获得顶点idreturn 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;elseSystem.out.print(" @--" + minLen + "--> ");return temp;}
}
运行结果:
请输入顶点个数: 5
=======请输入顶点1至其他各顶点的边距=======
至 顶点2 的距离 :15
至 顶点3 的距离 :24
至 顶点4 的距离 :33
至 顶点5 的距离 :28
=======请输入顶点2至其他各顶点的边距=======
至 顶点1 的距离 :16
至 顶点3 的距离 :25
至 顶点4 的距离 :18
至 顶点5 的距离 :21
=======请输入顶点3至其他各顶点的边距=======
至 顶点1 的距离 :29
至 顶点2 的距离 :30
至 顶点4 的距离 :25
至 顶点5 的距离 :29
=======请输入顶点4至其他各顶点的边距=======
至 顶点1 的距离 :31
至 顶点2 的距离 :36
至 顶点3 的距离 :22
至 顶点5 的距离 :11
=======请输入顶点5至其他各顶点的边距=======
至 顶点1 的距离 :-1
至 顶点2 的距离 :-1
至 顶点3 的距离 :30
至 顶点4 的距离 :39
顶点1 @--15--> 顶点2 @--18--> 顶点4 @--11--> 顶点5 @--30--> 顶点3
用java编写的一个迪杰斯特拉算法(单源最短路径算法,Dijkstra算法)。相关推荐
- usaco Sweet Butter(迪杰斯特拉(优先队列优化),bellman_ford算法模板)
这题开始用没有优化的迪杰斯特拉喜闻乐见的超时了,然后我用bellmanford算法按理说时间复杂度更大但是书上说往往只要很短的时间就可以求出最短路. 所以我用了这个算法但是我对这个算法还是不熟套了模板 ...
- Dijkstra(迪杰斯特拉)算法(单源最短路径算法)的理解
介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...
- JAVA编程求单源最短路径_【算法】单源最短路径——dijkstra算法
一,概念 单源最短路径 给定一个带权有向图G=(V,E),其中每条边的权是一个实数.另外,还给定V中的一个顶点,称为源.要计算从源到其他所有各顶点的最短路径长度.这里的长度就是指路上各边权之和.这个问 ...
- Dijkstra算法 迪杰斯特拉算法 单源最短路径
写在前边的话:你的支持是我写作的动力,有帮助到你的话麻烦点赞加收藏呦.感激不尽!如有错误也请留言指正. 考研数据结构练习,欢迎订阅我的专辑<考研数据结构题型分类讲解练习> [东南大学200 ...
- 最短路径之Dijkstra(迪杰斯特拉)算法(无向图)
简介 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.由for循环可知,其时间 ...
- [转]最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现
最短路径算法-Dijkstra(迪杰斯特拉)算法分析与实现(C/C++) Dijkstra算法 ----------- 最后更新时间:2011.9.25 ----------- Dijkstra(迪杰 ...
- java数据结构和算法——迪杰斯特拉(Dijkstra)算法
目录 一.迪杰斯特拉(Dijkstra)算法介绍 二.迪杰斯特拉(Dijkstra)算法过程 三.迪杰斯特拉(Dijkstra)算法--应用场景(最短路径问题) 四.迪杰斯特拉(Dijkstra)算法 ...
- 643-Dijkstra迪杰斯特拉算法
Dijkstra迪杰斯特拉算法 每个顶点之间的边都带着1个权值,这个权值可以表示任意的花费,距离,时间等等. 比如说我们指定一个起始的顶点A,和一个末尾的顶点E, 如果我们要求这2个单元之间的最短路径 ...
- 数据结构-迪杰斯特拉,佛洛依德(两顶点之间可到达的最短距离)
说来很惭愧,有个兄弟找我做了一道图的生成树题目我把题目给看错了,给看作求最小两点之间的可到达最短距离,本来题目意思是求任意两个村庄之间可以互通的最小资金花费,,,,我都不知道怎么看成了两点之间的最短路 ...
最新文章
- 机器学习四剑客4——PIL
- ML之预测:玩转2018世界杯—采用机器学习预测小组赛、十六比赛、四决赛、半决赛、决赛以及世界杯总冠军的各个队伍
- python命名元组
- 信息系统项目管理师考试资料
- php 水平测试,测试您的 PHP 水平的题目_PHP教程
- java毛玻璃_模糊效果(毛玻璃效果)
- DB2 9 使用开辟(733 测验)认证指南,第 3 局部: XML 数据独霸(2)
- AD19PCB增加board shape即增大黑色布的面积
- Windows2000系统下Apache2和PHP4安装终级宝典
- java给list排序_java 怎么将List里面数据排序
- LNMP架构数据迁移到NFS存储
- 在虚拟机安装windows xp时所需要的序列号
- 软件评测师考试(再来看一遍书,整理知识点)
- PHP字符串函数 查找字符位置函数
- HTML的表格边框的合并
- 大宗商品交易平台:解决期货的最后“一公里”
- 上班/读研办公室摸鱼如何快速切屏不留痕迹?Win10切屏快捷键赶紧收藏起来
- 各大IT公司的起名缘由 [转载]
- Excel2010条件格式结合公式和格式刷使用存在严重bug
- 基于tiny4412的Linux内核移植 -- 设备树的展开【转】