java搜索无向图中两点之间所有路径的算法

yizhihongxing

Java搜索无向图中两点之间所有路径的算法

算法思路

该算法使用深度优先搜索来查找两个节点之间的所有路径。在搜索期间,对于每个遍历到的未访问节点,我们可以标记它为已访问,并沿着它的所有未访问邻居递归搜索。在这个过程中,我们将到达一个目标节点作为目标终点,或遍历了所有的节点,这代表着没有路径可以到达目标终点,此时我们就回溯到上一步去探索其它可能的路径,直到找到所有的路径或者遍历完所有路径。

代码实现

代码实现分为如下几个步骤:

  1. 初始化所有节点为未访问状态,把起始节点添加到路径中,标记起始节点为已访问状态;
  2. 从起始节点开始深度优先搜索,对于每个遍历到的未访问节点,标记它为已访问,并将其添加到路径中;
  3. 如果当前节点为目标节点,则输出这个路径;
  4. 如果当前节点不是目标节点,则在继续递归搜索之前,搜索其所有未访问邻居节点;
  5. 回溯到上一个节点,回收资源,从路径中删除该节点并将其标记为未访问;
  6. 重复上述操作,直到搜索完所有路径。
public class Graph {
    private int V;
    private LinkedList<Integer>[] adj;

    public Graph(int v) {
        V = v;
        adj = new LinkedList[v];
        for (int i = 0; i < v; ++i) {
            adj[i] = new LinkedList();
        }
    }

    void addEdge(int v, int w) {
        adj[v].add(w); // Add w to v's list.
        adj[w].add(v); // Add v to w's list.
    }

    // A recursive function to print all paths from 'u' to 'd'.
    // visited[] keeps track of vertices in current path.
    // path[] stores actual vertices and path_index is current
    // index in path[]
    void printAllPathsUtil(int u, int d, boolean[] visited, int[] path, int pathIndex) {
        visited[u] = true;
        path[pathIndex] = u;
        pathIndex++;

        if (u == d) {
            for (int i = 0; i < pathIndex; i++) {
                System.out.print(path[i] + " ");
            }
            System.out.println("");
        } else {
            Iterator<Integer> i = adj[u].listIterator();
            while (i.hasNext()) {
                int n = i.next();
                if (!visited[n]) {
                    printAllPathsUtil(n, d, visited, path, pathIndex);
                }
            }
        }

        // Remove current vertex from path[] and mark it as unvisited
        pathIndex--;
        visited[u] = false;
    }

    void printAllPaths(int s, int d) {
        boolean[] visited = new boolean[V];
        int[] path = new int[V];
        int pathIndex = 0;
        // Initialize all vertices as not visited
        for (int i = 0; i < V; i++) {
            visited[i] = false;
        }

        // Call the recursive helper function to print all paths
        printAllPathsUtil(s, d, visited, path, pathIndex);
    }

    public static void main(String[] args) {
        Graph g = new Graph(4);
        g.addEdge(0, 1);
        g.addEdge(0, 2);
        g.addEdge(0, 3);
        g.addEdge(2, 0);
        g.addEdge(2, 1);
        g.addEdge(1, 3);

        int s = 2, d = 3;
        System.out.println("Following are all different paths from " + s + " to " + d);
        g.printAllPaths(s, d);
    }
}

示例说明

示例1

例如,我们有一个无向图,有四个节点,边的连接如下所示:

  0 ------- 1
  |         |
  |         |
  |         |
  2 ------- 3

我们要查找从节点2到节点3之间的所有路径,那么可以使用如下代码来实现:

Graph g = new Graph(4);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(0, 3);
g.addEdge(2, 0);
g.addEdge(2, 1);
g.addEdge(1, 3);

int s = 2, d = 3;
System.out.println("Following are all different paths from " + s + " to " + d);
g.printAllPaths(s, d);

输出结果为:

Following are all different paths from 2 to 3
2 0 1 3
2 1 3
2 0 3

可以看出,从节点2到节点3,有三条不同的路径,分别是2->0->1->3,2->1->3,2->0->3。

示例2

再例如,我们有一个无向图,有六个节点,边的连接如下所示:

     0 ----- 1
     |\     /|
     | \   / |
     |  \ /  |
     |   3   |
     |  / \  |
     | /   \ |
     |/     \|
     2 ----- 4
            |
            |
            |
            5

我们要查找从节点0到节点5之间的所有路径,那么可以使用如下代码来实现:

Graph g = new Graph(6);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(0, 3);
g.addEdge(1, 3);
g.addEdge(1, 4);
g.addEdge(2, 3);
g.addEdge(2, 4);
g.addEdge(3, 4);
g.addEdge(4, 5);

int s = 0, d = 5;
System.out.println("Following are all different paths from " + s + " to " + d);
g.printAllPaths(s, d);

输出结果为:

Following are all different paths from 0 to 5
0 1 3 4 5 
0 1 4 5 
0 2 3 4 5 
0 2 4 5 
0 3 4 5 

可以看出,从节点0到节点5,有五条不同的路径,分别是0->1->3->4->5,0->1->4->5,0->2->3->4->5,0->2->4->5,0->3->4->5。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java搜索无向图中两点之间所有路径的算法 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 使用Java实现qq邮箱发送邮件

    使用Java实现qq邮箱发送邮件的完整攻略 1. 前置条件 在使用Java编写发送邮件的程序之前,需要确保以下条件已经满足: 已经安装并配置好了Java开发环境。 有qq邮箱账号,并开启了SMTP服务。 2. 导入相应的依赖 在发送邮件之前,需要导入JavaMail API,可以在Maven中加入以下依赖: <dependency> <gr…

    Java 2023年6月16日
    00
  • IDEA编辑器整合Apache Tomcat的详细教程

    IDEA编辑器整合Apache Tomcat的详细教程 步骤1:下载和安装Apache Tomcat 在官网https://tomcat.apache.org/下载Tomcat安装包。选中最新版本,下载zip或tar.gz格式的文件。解压并安装Tomcat。 步骤2:配置Tomcat服务器 打开IDEA编辑器,点击“Run”→“Edit Configurat…

    Java 2023年5月20日
    00
  • springBoot下实现java自动创建数据库表

    下面是详细的攻略: 1. 环境准备 首先,我们需要准备以下环境: JDK 1.8 Maven 3.x IntelliJ IDEA(或者其他喜欢的IDE) 确保你已经安装了以上软件,并且已经设置好了环境变量。 2. 创建Spring Boot项目 第二步,我们需要创建一个Spring Boot项目,方法如下: 打开IntelliJ IDEA,选择 File -…

    Java 2023年5月19日
    00
  • Java中的ClassNotFoundException是什么?

    ClassNotFoundException是Java中的一种异常类型,表示虚拟机在试图加载类时无法找到指定的类。 当Java虚拟机无法找到某个类时,会抛出ClassNotFoundException异常。通常情况下,这种情况发生在以下几种情形中: 使用Class.forName()方法加载类时,指定的类不存在; 使用ClassLoader.loadClas…

    Java 2023年4月27日
    00
  • JSP forward用法分析实例代码分析

    JSP的forward指令可以实现JSP页面之间的跳转,并且可以把参数传递给下一个JSP页面。下面我们来详细讲解JSP forward用法分析实例代码分析,包含以下几个方面: forward指令的基本语法 JSP的forward指令的基本语法如下: <%@ page language="java" contentType=&quot…

    Java 2023年6月15日
    00
  • Spring Boot webflux使用方法解析

    下面是关于“Spring Boot webflux使用方法解析”的完整攻略,包含两个示例说明。 Spring Boot webflux使用方法解析 Spring Boot webflux是Spring Boot框架的一部分,它提供了一种基于响应式编程的方式来构建Web应用程序。本文将详细介绍如何使用Spring Boot webflux来构建Web应用程序。…

    Java 2023年5月17日
    00
  • JavaSpringBoot报错“HeuristicMixedException”的原因和处理方法

    原因 “HeuristicMixedException” 错误通常是以下原因引起的: 分布式事务问题:如果您的代码中存在分布式事务问题,则可能会出现此错误。在这种情况下,需要检查您的代码并确保分布式事务正确。 事务管理器问题:如果您的事务管理器存在问题,则可能会出现此错误。在这种情况下,需要检查您的事务管理器并确保它们正确。 解决办法 以下是解决 “Heur…

    Java 2023年5月4日
    00
  • JAVA随机打乱数组顺序的方法

    下面是“JAVA随机打乱数组顺序的方法”的完整攻略: 题目分析 首先,我们需要了解一下题目的意思,了解题目的要求是什么。题目要求我们实现一种方法,可以随机打乱给定数组的元素顺序。 方法解析 接下来,我们来分析一下如何实现这种方法。一种简单的方式是通过 Fisher–Yates 洗牌算法(也称为 Knuth 洗牌算法)来实现。该算法通常被认为是一种非常高效的打…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部