如何检测不包含有向图的特定节点的循环?

问题描述

给定一个有向图,其中有 n 个节点(节点编号为 1 到 n)和节点之间的 m 个单向道路/边。我们需要从节点 1 开始旅程,目的地是节点 n。我们需要检查是否可以在不访问节点 n 的情况下在道路上无限行驶,如果可能,则打印“是”或“否”。此外,如果从节点 1 到 n 不存在路径,则打印“no”。 n和m的值最大可达10^5。

示例:n=5,m=5

1 2 [这里的 1 2 表示节点 1 和节点 2 之间存在边]

2 3

3 4

4 5

5 2

答案:不,因为我们不能在不看到 5 的情况下无限地遍历节点。

n=5 m=5

1 2

2 3

3 4

4 5

4 2

答案:是的,存在一条路径,我们可以在其中不访问节点 5。

我尝试先实现深度优先搜索的想法,以检查是否存在从 1 到 n 的路径。如果它存在,则检查是否有办法在图中找到不包含节点 n 的循环。这个想法是通过最初访问第 n 个节点然后检查循环来自定义 DFS。循环检测的想法取自以下 URL - https://www.geeksforgeeks.org/detect-cycle-in-a-graph/

我的方法

public static void dfsCustom(int source,int dest,int numberOfNodes)
    {
         boolean visited[]=new boolean[numberOfNodes+1];
         boolean recurVisit[]=new boolean[numberOfNodes+1];
         boolean res=customUtil(source,dest,visited,recurVisit);
         if(res)
           System.out.println("yes");
         else
         System.out.println("no");
    }
    public static boolean customUtil(int source,boolean visited[],boolean recurVisit[])
    {
         visited[dest]=true; //Making the destination node visited in the beginning.
         if(recurVisit[source])
            return true;
         if(visited[source])
           return false;
         visited[source]=true;
         recurVisit[source]=true;
         for(int v:graph[source])
         {
            if(customUtil(v,recurVisit))
              return true;
         }
         recurVisit[source]=false;
         return false;
    }

我已将完整代码粘贴到此处以检查案例 - https://pastebin.com/CWwyTf1X

考虑到上述限制,是否有一些边缘情况可能无法涵盖?

解决方法

在这一点上你肯定有问题:

   if(recurVisit[source])
        return true;
     if(recurVisit[source])
       return false;

也许是第二个

 if (visited[source])
   return false;