java—如何检测不由有向图的特定节点组成的循环?

shyt4zoc  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(328)

给定一个有向图,它有n个节点(节点编号为1到n),节点之间有m条单向道路/边。我们需要从节点1开始旅程,目的地是节点n。我们需要检查是否可以在不访问节点n的情况下在道路上无限行驶,如果可能,则打印“是”或“否”。另外,如果没有从节点1到n的路径,则打印“否”。n和m的值可以高达10^5。
示例:n=5,m=5
12[这里12表示节点1和节点2之间存在一条边]
2 3
3 4
4 5
5 2
答:没有,因为我们不能在不访问5的情况下内遍历节点。
n=5米=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, int dest, 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,dest,visited,recurVisit))
              return true;
         }
         recurVisit[source]=false;
         return false;
    }

我已经把我的全部代码贴在这里检查这个案子-https://pastebin.com/cwwytf1x
有没有一些边缘的情况,它可能不涵盖鉴于上述限制?

3hvapo4f

3hvapo4f1#

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

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

也许第二个是

if (visited[source])
   return false;

相关问题