查找有向图中长度为 K 的路径数


给定一个有向无权图 G 和一个整数 K。您必须找到图中长度为 K 的路径数。此处,图以邻接矩阵的形式给出。从顶点 i 到 j,如果存在边,则表示为 G[i][j]=1,否则表示为 G[i][j]=0。

输入

  • 由邻接矩阵表示的有向无权图

  • 表示要查找的路径长度的整数 K

输出

长度为 K 的路径总数

案例 I K=3

输出

路径总数= 2

解释

在上图中,有两条长度为 3 的路径。它们是-

  • 0->1->2->3

  • 0->2->3->1

案例 II K=2

输出

路径总数 = 6

解释

在上图中,有两条长度为 3 的路径。它们是-

  • 0->1->2

  • 0->2->3

  • 1->2->3

  • 2->3->4

  • 3->4->1

  • 4->1->2

示例

import java.util.*;

public class Main {
   public static void main(String[] args) {
      int[][] G = {
         {0, 1, 1, 0},
         {0, 0, 1, 0},
         {0, 0, 0, 1},
         {0, 1, 0, 0}
      };
      int K = 3;
      List<List<Integer>> paths = fpath(G, K);
      
      System.out.println("Paths of length are");
      int count=0;
      for (List<Integer> path : paths) {
         count++;
         System.out.println(path);
      }
      System.out.println("Total number of paths "+count);
   }
   
   public static List<List<Integer>> fpath(int[][] G, int K) {
      List<List<Integer>> paths = new ArrayList<>();
      List<Integer> path = new ArrayList<>();
      boolean[] visited = new boolean[G.length];
      
      // Start the search from each vertex
      for (int i = 0; i < G.length; i++) {
         dfs(G, i, K, path, visited, paths);
      }
      
      return paths;
   }
   
   private static void dfs(int[][] G, int vertex, int K, 
List<Integer> path, boolean[] visited, 
List<List<Integer>> paths) {
      visited[vertex] = true;
      path.add(vertex);
      
      if (K == 0) {
         paths.add(new ArrayList<>(path));
      } else {
         for (int n = 0; n < G.length; n++) {
            if (G[vertex][n] == 1 && !visited[n]) {
               dfs(G, n, K - 1, path, visited, paths);
            }
         }
      }
      
      visited[vertex] = false;
      path.remove(path.size() - 1);
   }
}

输出

Paths of length are
[0, 1, 2, 3]
[0, 2, 3, 1]
Total number of paths 2

解释

为了找到长度等于 K 的路径,我们将使用 DFS(深度优先搜索)方法。有两个辅助函数 - fpath() 和 dfs()。

fpath() 函数

  • 在 fpath() 函数中,邻接矩阵 G 和 K 作为参数传递。它返回一个包含列表作为路径的列表。此外,还打印了长度为 K 的路径总数。

  • 初始化一个包含路径的列表列表,并初始化当前路径列表。创建一个布尔数组来标记已访问的顶点。为每个顶点调用 dfs() 方法,并检查它是否包含长度为 K 的路径。

dfs() 函数

  • dfs() 函数用于执行深度优先搜索操作。它是一个递归函数。我们将传递图、当前顶点、剩余长度 K、已访问路径、一个跟踪已访问顶点的布尔数组 visited,以及“paths”(包含路径的列表列表)来存储路径。

  • 在给定的 dfs() 函数中,我们将标记该顶点为已访问并将其添加到已访问路径中。现在访问相邻的顶点。如果相邻的顶点未被访问,则使用新顶点和剩余长度 K-1 递归调用 dfs() 函数。

  • 如果 K 的值为 0,这是我们的基本情况,则当前已访问的路径将添加到“paths”中。否则,如果从顶点到邻居存在路径并且邻居未被访问,则递归调用该函数。

  • 访问完所有邻居后,将顶点标记为未访问并将其从当前已访问路径列表中删除。这也被称为回溯。

更新于: 2023-07-24

441 次浏览

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告