问题描述
给定一个有向图,其中有 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;