1.需求及实现目标

需求

图数据,有向图,给定起点和终点,返回所有可能到达的路径

实现目标

输入:图数据邻接表,起点,终点
输出:起点 到 终点所有可能的路径

举例 关系图如上 输入 start = A ,end = E
输出

我这边业务中最后需要将数据中所有的顶点单独取出,拼成前端G6需要的json,这里就只简单写个demo;

还有一些情况

上图有B 点这种环的情况 start = A ,end=H 的话, 需要将这个环也输出出来,即所有可能到达的路径.

2.代码实现

思路

使用图的遍历,从起点开始,查找终点.
只用广度遍历没实现明白.只能找一种路径.
只用深度遍历,想找所有可能的路径就需要深度的时候往回退,关系多了的时候巨慢.
两者结合
在广度遍历的时候,进行深度遍历,深度遍历只要能查到一种到达终点的方式便记录该顶点.

public class TestGraph {public static void main(String[] args) {Graph graph = new Graph();addData(graph);Map<String, List<Edge>> adjacencyList = graph.getAdjacencyList();String start = "A";String end = "E";List<Edge> re = findAllPathBFS(adjacencyList, start, end);for (Edge edge : re) {System.out.println(edge.getSource() + "-->" + edge.getDestination());}}//核心查找方法private static List<Edge> findAllPathBFS(Map<String, List<Edge>> adjacencyList, String start, String end) {List<Edge> re = new ArrayList<>();Queue<String> queue = new LinkedList<>();List<String> vz = new ArrayList<>();queue.offer(start);vz.add(start);while (!queue.isEmpty()) {String poll = queue.poll();List<Edge> edges = adjacencyList.get(poll);//防止到达终点继续广度遍历if (!poll.equals(end)){for (Edge edge : edges) {if (!vz.contains(edge.getDestination())) {queue.offer(edge.getDestination());vz.add(edge.getDestination());}if (findPathDFS(adjacencyList, edge.getDestination(), end)) {re.add(new Edge(poll, edge.getDestination()));}}}}return re;}private static boolean findPathDFS(Map<String, List<Edge>> adjacencyList, String start, String end) {return dfsStack(adjacencyList, start, end);}private static boolean dfsStack(Map<String, List<Edge>> adjacencyList, String start, String end) {Stack<String> data = new Stack<>();List<String> visited = new ArrayList<>();data.push(start);while (!data.isEmpty()) {String pop = data.pop();if (pop.equals(end)){return true;}if (!visited.contains(pop)) {visited.add(pop);for (Edge neighbor : adjacencyList.get(pop)) {if (!visited.contains(neighbor.getDestination())) {data.push(neighbor.getDestination());}}}}return false;}// 深度优先搜索递归函数private static boolean dfsD(Map<String, List<Edge>> adjacencyList, String start, String end, List<String> visited, boolean b) {visited.add(start);if (start.equals(end)) {b = true;} else {for (Edge neighbor : adjacencyList.get(start)) {if (!visited.contains(neighbor.getDestination())) {dfsD(adjacencyList, neighbor.getDestination(), end, visited, b);}}}visited.remove(start); // 重置当前顶点的访问状态return b;}private static void addData(Graph graph) {graph.addVertex("A");graph.addVertex("B");graph.addVertex("C");graph.addVertex("D");graph.addVertex("E");graph.addVertex("F");graph.addVertex("G");graph.addEdge("A", "B");graph.addEdge("A", "C");graph.addEdge("B", "D");graph.addEdge("C", "D");graph.addEdge("C", "E");graph.addEdge("D", "E");graph.addEdge("D", "F");graph.addEdge("F", "A"); // 添加一个环graph.addEdge("F", "G");}static class Graph {private int V; // 顶点数private Map<String, List<Edge>> adjacencyList; // 邻接表public Graph() {V = 0;adjacencyList = new HashMap<>();}// 添加顶点public void addVertex(String vertex) {adjacencyList.put(vertex, new ArrayList<>());V++;}// 添加边public void addEdge(String source, String destination) {Edge edge = new Edge(source, destination);adjacencyList.get(source).add(edge);}public int getV() {return V;}public Map<String, List<Edge>> getAdjacencyList() {return adjacencyList;}}static class Edge {private String source;private String destination;public Edge(String source, String destination) {this.source = source;this.destination = destination;}public String getSource() {return source;}public String getDestination() {return destination;}}
}

代码融合到业务中目前看实现的没啥问题,发出来也是看看有没有大佬帮忙指点一下,看看有没有错误,或者更好的方式.

图数据,有向图,给定起点和终点,返回所有可能到达的路径,java.相关推荐

  1. java中使用es的dsl_基于DSL的基于图论的Java程序中输入图数据的方法

    java中使用es的dsl 我们大多数人已经编写了一些处理图论算法的程序,例如找到两个顶点之间的最短路径,找到给定图的最小生成树等等. 在这些算法的每一种中,表示图形的编程方式是使用邻接矩阵或邻接列表 ...

  2. java 常用流_Java流类图结构: 流的概念和作用流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数...

    Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观 ...

  3. 获得有向无环图中起点到终点的所有路径_力扣1514——概率最大的路径

    本题主要和图的遍历求解最短路径相关,可以用 Dijkstra 或者 Bellman-Ford 算法进行解决. 原题 给你一个由 n 个节点(下标从 0 开始)组成的无向加权图,该图由一个描述边的列表组 ...

  4. [Origin]图像属性:画图时修改直线的起点和终点、随图层和坐标变化、多y轴图独立编辑线条属性

    假设你现在需要在Origin中从一个图像上选两个点,做一条过这两个点的直线l1,再做一条与l1平行且过已知点的直线l2 (图1 工程力学实验-规定非比例伸长应力测定-测回法) ①取点可以使用scree ...

  5. 【小米校招笔试】给定一些线段,线段有起点和终点,求这些线段的覆盖长度,重复的部分只计算一次

    2016年小米校招笔试第一题(西安站) 1 给定一些线段,线段有起点和终点,求这些线段的覆盖长度,重复的部分只计算一次. 参考解法(Java版): package XiaoMi;/********** ...

  6. 【CCCC】L3-025 那就别担心了 (30分),dfs搜索起点到终点的路径条数。

    problem L3-025 那就别担心了 (30分) 下图转自"英式没品笑话百科"的新浪微博 -- 所以无论有没有遇到难题,其实都不用担心. ziqia.jpg 博主将这种逻辑推 ...

  7. 数据结构之图:有向图的介绍与实现,Python代码实现——25

    有向图的介绍 引入 在实际生活中,很多应用相关的图都是有方向性的,最直观的就是网络,可以从A页面通过链接跳转到B页面,那么a和b连接的方向是a->b,但不能说是b->a,此时我们就需要使用 ...

  8. 开源开放 | 图数据交互可视化分析框架 InteractiveGraph v0.3 版本发布

    图数据交互可视化分析框架 InteractiveGraph 日前发布 v0.3 版本,下载地址:https://github.com/grapheco/InteractiveGraph/release ...

  9. 图(有向图、无向图)

    一.图的概念 1 .图的定义 图 1.3-1所示的 ⑴, ⑵, ⑶均为图 (Graph),它有若干个不同的点 v 1, v 2, -, v n,在其中一些点之间用直线或曲线连接.图中的这些点被称为顶点 ...

最新文章

  1. 输入空格hdu - 1010 - Tempter of the Bone
  2. 就你这个求婚态度,能嫁给你才怪!
  3. 第3章 java的基本程序设计结构
  4. NOI08冬令营 数据结构的提炼与压缩
  5. Consul注册中心删除某个服务
  6. 流行前端几大UI框架排行榜
  7. 2020年阴历三月初九投资理财~从牛人那里吸取能量,让自己更加强大
  8. 多行文字内容溢出显示点点点(...)省略号
  9. 不同时区时间换算_不同时区时间转换
  10. 腾讯云大带宽云服务器20M性能评测
  11. C语言循环结构输出爱心,C语言--循环结构(示例代码)
  12. C# CAD二次开发之基本图形
  13. 玩客云pc端_玩客云下载 玩客云电脑版下载
  14. C语言 epoll 工作模式之lt 等级触发 level trigger
  15. 空调器制冷系统故障-蒸发器反面脏堵
  16. 1384Piggy-Bank
  17. (一)图像分类任务介绍 Image Classification
  18. python二级用的是什么软件_考计算机二级用啥软件练
  19. AC旁挂式组网的思路
  20. 网络安全-跨站请求伪造(CSRF)的原理、攻击及防御

热门文章

  1. 出国读研去哪国最合适?
  2. ubuntu 上 ufw 配置
  3. win10 安装flutter
  4. 所有国家的信息数据(包含图片对应、区号前缀、国家名字、国家缩写)js、ts
  5. 竞争性关键词推荐算法设计(中南大学电子商务课程实践)
  6. 又一篇——崔永元逗老外
  7. BCGControlBarPro CBCGPGridCtrl单元格添加控件
  8. 分布式专题-NIO框架之Netty01-Java IO 演进之路
  9. 测试mSATA盘在linux下挂载时读写速度
  10. go 结构体和类 函数和方法 接口