我知道这个问题已经在本论坛和互联网上被问了很多次。但在你们用利爪攻击我之前,请先忍耐一下。
我是一个学习图形的新手。作为我的练习,我需要在这里的Graph类中添加一个hasCycle()方法,链接如下: http://homepage.cs.uiowa.edu/~sriram/21/fall05/ExamplePrograms/ReaderFiles/Chap13/dfs/dfs.java。
我的方法是,在这个论坛中建议的那样进行深度优先搜索,链接如下:Finding a cycle in an undirected graph vs finding one in a directed graph。
但我不知道如何使用第一个链接中现有的dfs方法来实现这一点。
到目前为止,我的方法是:
我有两个问题: 首先,当我在DFSApp类中调用hasCycle()时,陷入了无限递归的状态,而不是直接调用 theGraph.dfs(); 其次,我没有像作业要求的那样使用给定的dfs()。
如果您能指出我哪里出错了,将不胜感激。
现在,我只专注于实现一个正确的独立的hasCycle()方法,而不使用dfs()。
我是一个学习图形的新手。作为我的练习,我需要在这里的Graph类中添加一个hasCycle()方法,链接如下: http://homepage.cs.uiowa.edu/~sriram/21/fall05/ExamplePrograms/ReaderFiles/Chap13/dfs/dfs.java。
我的方法是,在这个论坛中建议的那样进行深度优先搜索,链接如下:Finding a cycle in an undirected graph vs finding one in a directed graph。
但我不知道如何使用第一个链接中现有的dfs方法来实现这一点。
到目前为止,我的方法是:
public boolean hasCycle(int start)
{
vertexList[start].wasVisited = true;
for(int j = 0; j < MAX_VERTS; j++)
{
if(adjMat[start][j]==1 && vertexList[j].wasVisited==true)
return true;
else if(adjMat[start][j]==1 && vertexList[j].wasVisited==false)
{
vertexList[start].wasVisited == true;
hasCycle(j);
}
}
return false;
}
我有两个问题: 首先,当我在DFSApp类中调用hasCycle()时,陷入了无限递归的状态,而不是直接调用 theGraph.dfs(); 其次,我没有像作业要求的那样使用给定的dfs()。
如果您能指出我哪里出错了,将不胜感激。
现在,我只专注于实现一个正确的独立的hasCycle()方法,而不使用dfs()。
hasCycle(i)
之前,你总是将vertexList[i].wasVisited
设置为true
;如果vertexList[i].wasVisited
为true
,你永远不会调用hasCycle(i)
;而且一旦vertexList[i].wasVisited
为true
,你就永远不会将其设置为false
。因此,虽然你的方法存在问题(特别是:除非vertexList[start]
本身是循环的一部分,否则它将始终返回false
),并且可能需要很长时间,但我认为它不应该具有无限递归。你为什么说它会无限递归呢? - ruakh