老师有一个题:

使用狄克斯屈拉(Dikjstra)标号算法可得出解:

我用Java来实现了一下这个算法:

package test;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.HashSet;

import java.util.List;

import java.util.Set;

import lombok.Data;

public class MinRoute {

public static void main(String args[]) {

List edges=initGraph();

//查找从v1到v7的最短路长及最短路线

findMinDistance("1","7",edges);

}

public static List findMinDistance(String from,String to,List edges){

Vertex fromVertex=findVertex(from,edges);

fromVertex.setMinLen(0);

Set passedEdge=new HashSet();

System.out.print("find path:"+fromVertex.getName()+"->");

Vertex findVertex=recursionFindMinEdge(fromVertex.getName(),edges,passedEdge);

while(findVertex!=null&&!findVertex.getName().equals(to)) {

System.out.print(findVertex.getName()+"->");

findVertex=recursionFindMinEdge(findVertex.getName(),edges,passedEdge);

}

if(findVertex!=null&&findVertex.getName().equals(to)) {

System.out.println(findVertex.getName());

System.out.println("find! the minPath is:");

StringBuffer sb=new StringBuffer();

sb.append(findVertex.getName()+" > ");

Vertex minFromVertex=findVertex.getMinFrom();

while(!minFromVertex.getName().equals(from)) {

sb.append(minFromVertex.getName()+" > ");

minFromVertex=minFromVertex.getMinFrom();

}

sb.append(from);

System.out.println(sb.reverse().toString());

}else {

System.out.println("not find!");

}

return null;

}

private static Vertex recursionFindMinEdge(String from,List edges,Set passedEdge) {

Vertex fromVertex=findVertex(from, edges);

//查出以当前顶点为始点的,且始点未标号的边

List fromEdges=findFromEdge(from,edges);

for(Edge edge:fromEdges) {

Integer oldMinLen=edge.getMinLen();

if(oldMinLen==null) {

edge.setMinLen(edge.getLen()+fromVertex.getMinLen());

}

}

passedEdge.addAll(fromEdges);

//查出之前走过的,且始点未标号的边。找到最小路径的边,并设置其终点的minLen

Edge minLenEdge=null;

for(Edge edge:passedEdge) {

if(edge.getTo().getMinLen()!=null) {

continue;

}

if(minLenEdge==null||edge.getMinLen()

minLenEdge=edge;

}

}

Vertex findTargetVertex=minLenEdge.getTo();

findTargetVertex.setMinLen(minLenEdge.getMinLen());

findTargetVertex.setMinFrom(minLenEdge.getFrom());

return findTargetVertex;

}

/**

* 初始化图

* @return 返回所有边

*/

private static List initGraph() {

Vertex v1=new Vertex("1");

Vertex v2=new Vertex("2");

Vertex v3=new Vertex("3");

Vertex v4=new Vertex("4");

Vertex v5=new Vertex("5");

Vertex v6=new Vertex("6");

Vertex v7=new Vertex("7");

List rst=Arrays.asList(

new Edge(v1,v2, 8),

new Edge(v1,v3, 6),

new Edge(v1,v4, 2),

new Edge(v2,v5, 5),

new Edge(v3,v6, 4),

new Edge(v3,v4, 2),

new Edge(v3,v2, 5),

new Edge(v4,v3, 3),

new Edge(v4,v6, 2),

new Edge(v5,v7, 5),

new Edge(v6,v2, 3),

new Edge(v6,v5, 10),

new Edge(v6,v7, 7)

);

return rst;

}

private static Vertex findVertex(String name,List edges) {

for(Edge edge:edges) {

if(edge.getFrom().getName().equals(name)) {

return edge.getFrom();

}else if(edge.getTo().getName().equals(name)){

return edge.getTo();

}

}

return null;

}

private static List findFromEdge(String name,List edges) {

List findEdges=new ArrayList();

for(Edge edge:edges) {

if(edge.getFrom().getName().equals(name)) {

findEdges.add(edge);

}

}

return findEdges;

}

}

//有向图始点

@Data

class Vertex{

private String name;

//临时变量,一次计算时从起点到这点的最小距离

private Integer minLen;

//临时变量,当得到最短路径时,记录上一个顶点

private Vertex minFrom;

public Vertex(String name) {

this.name=name;

}

}

@Data

class Edge{

private Vertex from;

private Vertex to;

//距离

private Integer len;

//临时变量,一次计算时从起点到"to"点的最小距离

private Integer minLen;

public Edge(Vertex from,Vertex to,Integer len) {

this.from=from;

this.to=to;

this.len=len;

}

}

最后打印结果:

find path:1->4->6->3->2->7

find! the minPath is:

1 > 4 > 6 > 7

java找图最短路径_查找有向图最短路径相关推荐

  1. python贪心算法最短路径_贪心算法---最短路径问题

    一,贪心算法的设计思想 • 从问题的某一个初始解出发逐步逼近给定的目标,每一步都作一个不可回溯的决策,尽可能地求得最好的解.当达到某算法中的某一步不需要再继续前进时,算法停止. 二,贪心算法的基本性质 ...

  2. Java找图 (截屏找图 大图找小图)--自己实现“按键精灵”

    最近老板给了个需求是要做一个在安卓模拟器上自动扫码支付的程序,本来以为用Appium就可以直接直接搞定的,但是最后发现Appium只能操作App,在模拟器的实际运行中App要进入扫码功能,还要点击安卓 ...

  3. java时序图工具_时序分析之STA(1)

    一个人的兴趣越广泛,他拥有属的快乐机会就越多,而受命运播弄的可能性也就越小,因为即使失去了某一种兴趣,他仍然可以转向另一种. - -罗素 一. STA 时序分析分为动态时序分析(DTA, Dynami ...

  4. java有向图最短路径_单源最短路径之Java实现(使用Java内置优先队列)

    import java.util.*; /** * 用堆实现了从一个点到其他点的最短路径 * @author 李赫元 */ public class ShortestPath { /**有n个节点*/ ...

  5. java找重复字符串_在java中怎样查找重复字符串

    在一段java编程代码中,字符串是不可缺少的一个要素,属于java中的基础知识,字符串不仅在java面试题中会出现,在编写代码时更要掌握怎样使用字符串.在前面我们也学习过关于字符串截取的知识,你应该有 ...

  6. java斗图表情_程序员之间的斗图表情包, java真的输惨了!

    表情包成了人与人聊天中不可少的分量,陌生人聊天表情包丢出去妥妥的拉近关系变熟络啊(¬_¬) 而且可以用表情包化解尴尬.缓解气氛,可以没话找话.忙的时候也可以当做结束语,显得比较有礼貌! 对于沉默寡言. ...

  7. python用动态规划求最短路径_动态规划之最短路径和

    给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [ [1,3,1], [1,5,1], ...

  8. java时序图工具_基于时序数据库,实现百亿级话单实时全景监控分析

    背景 随着流量业务的高速发展以及已经到来的5G时代,业务支撑系统的规模不断增大.服务不断增多,业务.应用和系统运行性能指标数据持续以指数级的速度增长,每日计费话单量已突破百亿.系统监控的实时性.准确性 ...

  9. java时序图工具_快速学习时序图:时序图简介、画法及实例

    点击上方☝Java编程技术乐园,轻松关注!及时获取有趣有料的技术文章 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 一. 什么是时序图? 时序图(Sequence Di ...

最新文章

  1. jQuery addClass,removeClass,class属性增删
  2. 界面-工作者线程结构之:异步委托调用
  3. approxPolyDP-轮廓近似
  4. cmd指令大全指令_干货 | Linux 超全实用指令大全
  5. IOS开发之----远程推送通知
  6. TeXworks 0.4.5 发布,TeX 编辑器
  7. 什么样的程序员是最让人讨厌的?朋友们注意了,别做这种人!
  8. 理解Linux下的SELinux(MAC)
  9. 内存cookie与持久cookie
  10. Linux环境下利用句柄恢复Oracle误删除的数据文件
  11. JDK5的新特性之 增强for
  12. 电商后台管理系统分享
  13. Python 写入txt文本文件
  14. 网站推广优化教程100条(完整版)
  15. 代理服务器proxy server
  16. 微信小程序微商城(五):动态API实现商品详情页(下)
  17. android canvas 背景图片,Android更改canvas背景颜色而不会丢失任何图纸
  18. scanf与getchar的区别
  19. 大数据工程师零基础起步——成长路线引入
  20. Logo tools

热门文章

  1. 存在量词后必须用合取式?-数学
  2. List再整理,从代码底层全面解析List(看完后保证收获满满)
  3. LeetCode简单题之较大分组的位置
  4. CVD-ALD前驱体材料
  5. TensorFlow Frontend前端
  6. 虚拟纹理与几何图像技术
  7. 图像实例分割:CenterMask
  8. Mysql锁专题:InnoDB锁概述
  9. linux ftp随机端口,linuxFTP生产环境配置
  10. HarmonyOS 修改App的默认加载的界面