如何判断一个图是否有环?

2023-12-22

我知道这个问题在这个论坛和互联网上的其他地方已经被问过很多次了。但在你伸出爪子攻击我之前,请耐心等待。

我是一个新手学习图。作为练习的一部分,我在此处的 Graph 类中添加了一个方法 has Cycle()http://homepage.cs.uiowa.edu/~sriram/21/fall05/ExamplePrograms/ReaderFiles/Chap13/dfs/dfs.java http://homepage.cs.uiowa.edu/~sriram/21/fall05/ExamplePrograms/ReaderFiles/Chap13/dfs/dfs.java.

我的方法是按照本论坛的建议进行 DFS在无向图中查找循环与在有向图中查找循环 https://stackoverflow.com/questions/10972028/finding-a-cycle-in-an-undirected-graph-vs-finding-one-in-a-directed-graph?rq=1.

但我正在努力如何使用第一个链接中现有的 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(j)。例如:

if (hasCycle(j))
    return true;

如果您确实遇到循环并一直返回 true 到顶层,这将“展开堆栈”。

另外,虽然这是一个小问题并且不会真正影响功能,但递归调用之前的行hasCycle(j)有几个问题。首先,它应该是单个等号而不是双等号。其次,它实际上是多余的,因为在递归调用中发生的第一件事hasCycle(j)是那个节点j将被标记为已访问。

考虑到这一点,以下是代码的简化:

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  ||  hasCycle(j)))
            return true;
    }
    return false;
}

在 @mehrmoudi 的评论后编辑:

哇。上面说的不太对啊!对不起!!在下面的修复中,我添加了parent范围。

public boolean hasCycle(int start, int parent)
{
    vertexList[start].wasVisited = true;
    for (int j = 0; j < MAX_VERTS; j++) {  
        if (j != parent  &&  adjMat[start][j] == 1  &&  (vertexList[j].wasVisited  ||  hasCycle(j, start)))
            return true;
    }
    return false;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何判断一个图是否有环? 的相关文章

  • 检查发送到网页的请求数

    我正在编写一个 Java 多线程应用程序 它可以访问不同 Web 服务器的数百万个 有时甚至数十亿个 URL 这个想法是检查这些 URL 是否给出有效的 200OK 响应或 404 其他代码 我如何知道我的程序是否不会在他们的服务器上造成高
  • Java中的文字赋值[重复]

    这个问题在这里已经有答案了 定义上有什么区别 double example 23 1d or double example 23 1 为什么long float double可以以l f d结尾 之间没有区别double example 2
  • 优化完美平方问题,类似于Python中的硬币找零

    我这里有一个硬币兑换的解决方案 python 中的 leetcode 硬币兑换 https stackoverflow com questions 69517078 coin change leetcode in python 因为完全平方
  • Java Spark DataFrameReader java.lang.NegativeArraySizeException

    学习 Spark for java 并尝试阅读 csv文件为DataFrame使用DataFrameReader 甚至不能得到一个超级简单的 csv文件工作 因为我不断收到异常java lang NegativeArraySizeExcep
  • AffineTransform.rotate() - 如何同时缩放、旋转和缩放?

    我有以下代码 它可以完成我想要绘制一个上面有一些棋子的棋盘的 第一部分 Image pieceImage getImage currentPiece int pieceHeight pieceImage getHeight null dou
  • Android 游戏偶尔出现延迟

    我正在用 Java 制作一个简单的 Android 游戏 我注意到每 20 40 秒就会出现一些烦人的延迟 首先 我认为它们是由垃圾收集器引起的 但当我检查 LogCat 时 我发现游戏滞后时没有垃圾收集 每当游戏开始滞后时 我都会标记日志
  • SwingWorker 在另一个 SwingWorker 的 did 方法中

    首先 我需要通知您 我正在尽最大努力学习如何用 Java 编写代码 虽然有点困难 但我相信我能做到 我过去提交了几个有关 SwingWorkers 等的问题 每一个我都以为我已经做到了 但后来发现我仍然需要学习 希望这一次不是那样的一次 话
  • 如何在 JdbcTemplate 中创建 mySQL 存储过程

    背景 为了解决 MySql 中某些语句只允许在存储过程中出现的问题 我尝试在 JdbcTemplate 提交的 sql 中创建 运行然后删除存储过程 一个简单的例子是 这恰好是在 Spring Boot 中 Service public c
  • 在 Java 中创建带注释的对象时收到通知

    Intent 我有一个自定义 Java 注释 DynamicField public class RESTEndpointInvoker DynamicField key httpTimeout private long httpTimeo
  • 从邻接表计算图的入度

    我遇到了这个问题 其中需要根据邻接列表表示来计算图的每个节点的入度 for each u for each Adj i where i u if i u E in degree u 1 现在根据我的说法 它的时间复杂度应该是O V E V
  • JFrame Glasspane 也优于 JDialog,但不应该

    我有一个带有 Glasspane 的 JFrame 未装饰 该框架打开一个 JDialog 也未装饰 也有一个 glassPane 并隐藏自身 setVisible false Glasspanes 通过 setGlassPane 设置 对
  • Java 不可变对象 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在学习不变性的概念 据我了解 一旦创建对象 不可变对象就无法更改其值 但我不明白不可变对象的以下用途 They are 自动是线程
  • bufferedinputstream 中标记读取限制有什么用

    我是Java流的新手 我想读取特定的文件内容 然后需要从头开始读取 我创建了一个 BufferedInputStream 但我对 BufferedInputStream mark int markLimit 的文档感到困惑 文档说 publ
  • “___ 中的方法 ___() 是在无法访问的类或接口中定义的”编译错误

    我发现了一个奇怪的编译限制 我无法解释 并且我不明白这个限制的原因 示例1 考虑这些类 In package e1 public class C1 enum E1 A B C public E1 x In package e2 import
  • Java 验证日期为 yyyyMMddHHmmss

    我想在java中验证给定的日期格式为yyyyMMddHHmmss 状况 应符合格式 yyyyMMddHHmmss 它应该验证当前日期 它应该验证与当前小时有 3 小时或 3 小时差异的小时数 如果满足所有三个条件 Java 方法应返回 tr
  • 在 REST Web 服务中接受逗号分隔值

    我正在尝试接收 REST URI 中以逗号分隔值形式的字符串列表 示例 http localhost 8080 com vogella jersey first rest todo test 1 abc test 其中 abc 和 test
  • 更新分页。是否可以?

    他们是否存在一些方法来处理更新分页 例如我有 100 行类型 Id private Integer id Column private boolean flag Column private Date last 一开始它们看起来像 id f
  • while 之后无法访问的语句[重复]

    这个问题在这里已经有答案了 我只是修改代码 在以下代码中出现错误 int x 1 System out println x x while true x System out println x x 错误在最后一行 我可以知道错误 错误 无
  • ASTParser:解析绑定后查找声明节点

    我创建了一个启用了绑定的 AST 当我稍后解析绑定时 我得到了一个有效的 ITypeBinding 但是 当我想要获取绑定的声明 Node 时 它 总是返回 null 除非 ITypeBinding 在 sourceFile 中声明 这是我
  • 如何创建具有同等时间元素的 JavaFX 转换?

    我正在尝试 JavaFX 和动画 尤其是PathTransition 我正在创建一个简单的程序 使球 弹跳 而不使用QuadCurveTo班级 到目前为止 这是我的代码 Ellipse ball new Ellipse 375 250 10

随机推荐

  • Javascript WebRTC 库的现状? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道哪个框架或库最适合使用 WebRTC 这是一个小型且不完整的库 SDK 列表 任何我忘记的库 请随时告诉我 图书馆 简单RTC
  • xslt 的优雅示例?

    经过 XAML 的长时间学习循环后 我回到了 HTML 和 javascript 并意识到声明性代码的概念 就转换规则而言 是一个非常强大的概念 尽管语法过多 但 XML 的 XSLT 处理仍然是声明性转换编程的基石 然而 我总是发现很难理
  • iPhone 的网络时间协议

    我正在编写一个需要精确计时的应用程序 问完后这个问题 https stackoverflow com questions 2264197 how to accurately sync time between iphones 我决定使用 N
  • 如何在打字稿Angular 4中将字符串转换为布尔值

    我知道我不是第一个问这个问题的人 正如我在标题中提到的 我正在尝试将字符串值转换为布尔值 我之前已将一些值放入本地存储中 现在我想获取所有值并将所有值分配给一些布尔变量 应用程序组件 ts localStorage setItem Chec
  • 我可以使用 GenericServlet 在 Tomcat 上实现套接字服务器吗?

    我想实现一个将由多个客户端连接的套接字服务器 为了使实现尽可能简单 并且不必对线程和连接等进行代码管理 我想使用 Tomcat 我们已经使用 tomcat 作为我们解决方案的一部分 我确信 Tomcat 可以用于非 http servlet
  • 优化php中的大导入

    我有一个简单的导入器 它会遍历相当大的 csv 的每一行并将其导入到数据库中 我的问题是 我应该调用另一个方法来插入每个对象 生成 DO 并告诉它的映射器插入 还是应该在导入方法中对插入过程进行硬编码 复制代码 我知道最优雅的做法是调用第二
  • idea intellij maven项目无法make

    我有 Maven 项目 Maven 构建完成成功 但我无法完成这个项目 信息 取得成功 项目包含一个模块 Idea 看不到依赖关系 Error 3 38 java D Dropbox Programming java spring spri
  • Javascript垂直居中div(可变高度)

    我正在尝试使用 Javascript 将 div 垂直居中 因为文本会发生变化 所以我不能使用固定的高度 我想做这个without Jquery box2 width 100 height 100 position relative bac
  • UITableViewCells 初始加载视图/显示问题

    所以我有一个UITableView加载多列报价 进入后UITableView显示此数据时 单元格最初似乎未正确加载 文本看起来确实被压扁和 或被切断 大约 1 2 秒后 它正确加载 一切正常 每次加载表视图时都会发生这种情况 例如 这是一个
  • 使用 DateTime 列设置 LinqDataSourceWhere 子句

    在 C net 中 我有以下数据源设置 我试图在后面的代码中动态分配 WHERE 子句
  • MySQL:在已填充的表中创建新的唯一字段

    我需要在数据库表中创建一个已填充数据的字段 当然 仅仅将字段添加为空是不可能的 我只能想到创建一个新结构的新表 并将现有数据复制到新表中 但我想知道是否有更简单的方法 提示 它是一个复合键 由同一个表中的其他 3 个字段组成 编辑 该字段保
  • 提取 msi 时出现错误 2203

    我在使用以下命令提取 msi 时收到 2203 错误 msiexec a C Test Installer msi QB targetDIR C Test Eval LV C Test INST Logfile log 回答时请考虑以下几点
  • 使用相对路径时 VS10 附加库目录失败

    当我使用相对路径设置项目时 它失败了 不起作用 属性 链接器 常规 附加库目录 libraries 工作正常 C Users NAME Desktop project libraries 如何使相对路径发挥作用 尝试使其相对于您的项目目录或
  • 如何获取匹配 REGEX 后的文本

    我有字符串 我的家 和正则表达式 例如 reg hom 我正在努力找出如何在比赛后获取文本 直到单词结尾 在本例中我正在寻找 e 另一个例子 string soulful reg soul gt gt gt 我需要 完整 先感谢您 您可以使
  • GCC 内存屏障 __sync_synchronize 与 asm 易失性("": : :"内存")

    asm volatile memory 通常用作内存屏障 例如 如 Linux 内核中所示 barrier macro 这听起来类似于 GCC 内置的 sync synchronize http gcc gnu org onlinedocs
  • 气流错误:AttributeError:模块“airflow.utils.log”没有属性“file_processor_handler”

    我的本地气流即时已启动并正在运行 但现在当我运行气流网络服务器或任何其他气流命令时 我收到以下错误 带有一些回溯 Unable to load the config contains a configuration error Traceb
  • 通过代码向 Winforms DataGridView 添加新列

    我正在尝试为给定月份的每一天添加 N 列 var daysCount DateTime DaysInMonth DateTime Now Year month for int i 1 i lt daysCount i dataGridVie
  • 有条件地平均 DataTable 中的一列数据

    我有一个 DataTable 对象 dTable 其中所有 DataColumn 数据类型都是字符串或双精度 列中的某些数字不存在 即 空 现在我有下面的代码来查找平均值 并且当有值时它效果很好 var sum dTable AsEnume
  • 如何在没有流或系统 io 的情况下压缩字节数组

    我正在尝试将图像编码为字节数组并将其发送到服务器 编码和发送部分工作正常 但我的问题是字节数 组太大并且发送时间太长 所以我认为压缩它会让它运行得更快 但实际的问题是我不能使用 system io 或流 我的目标是 net 2 0 谢谢 u
  • 如何判断一个图是否有环?

    我知道这个问题在这个论坛和互联网上的其他地方已经被问过很多次了 但在你伸出爪子攻击我之前 请耐心等待 我是一个新手学习图 作为练习的一部分 我在此处的 Graph 类中添加了一个方法 has Cycle http homepage cs u