检测图中的所有圆圈

2024-04-06

我有一个存储在 Map 数据结构中的有向图,其中键是节点的 ID [value]是key节点所指向的节点的nodeId数组。

Map<String, String[]> map = new HashMap<String, String[]>();
map.put("1", new String[] {"2", "5"});
map.put("2", new String[] {"3"});
map.put("3", new String[] {"4"});
map.put("4", new String[] {"4"});
map.put("5", new String[] {"5", "9"});
map.put("6", new String[] {"5"});
map.put("7", new String[] {"6"});
map.put("8", new String[] {"6"});
map.put("9", new String[] {"10"});
map.put("10", new String[] {"5"});
map.put("11", new String[] {"11"});

我编写了一个递归搜索算法,试图找到图中的圆圈。

Set<String> nodes = map.keySet();

    for(String node : nodes) {
        List<String> forbiddens = new ArrayList<>(); // This list stores the touched nodes, during the process.
        forbiddens.add(node);
        recursiveSearch(node, forbiddens);
    }

该函数由上面的代码调用。

private void recursiveSearch(String nodeId, List<String> forbiddens) {
    String[] neighbours = map.get(nodeId); // The given node's neighbours
    for(String neighbour : neighbours) {
        for(String forbidden : forbiddens) {
            if(neighbour.equals(forbidden)) {
                ways.add( getClone(forbidden) ); //getClone returns the copy of a given List, "ways" is a List<List<String>> which contains the lists of paths which are leading to a circle in the graph
                return;
            }
        }
        forbiddens.add(neighbour);
        recursiveSearch(neighbour, forbiddens);
        forbiddens.remove(neighbour);
    }
}

有些路径包含我想删除的额外节点(不在圆圈中)。 我想请求帮助从“方式”列表中选择节点以获得圆的实际节点。

这个算法能找到图中的所有圆圈吗?


由于有向图中的圆圈表示强连通分量,因此您可以使用维基百科页面上引用的任何算法来查找强连通分量https://en.wikipedia.org/wiki/Strongly_connected_component https://en.wikipedia.org/wiki/Strongly_connected_component- 例如 Tarjan 的算法基于深度优先搜索:https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm

编辑:强连接组件可能包含多个彼此共享节点的圆。因此,必须对每个组件进行手动检查,但应该很容易。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检测图中的所有圆圈 的相关文章

  • JDK 文档是语言规范的一部分吗?

    只有一名官员Java语言规范 https docs oracle com javase specs jls se8 html index html所有 Java 实现都必须遵守它 API文档怎么样 所有Java实现都需要遵守吗这个版本 ht
  • 如何将画廊意图中的“打开”更改为“完成”?

    我使用以下意图打开画廊来选择多个图像和视频 Intent intent new Intent intent setType image video intent putExtra Intent EXTRA ALLOW MULTIPLE tr
  • 使用 Ant 将非代码资源添加到 jar 文件

    我正在将 java 应用程序打包成 jar 文件 我正在使用 ant 和 eclipse 我实际上需要在 jar 中直接在根文件夹下包含几个单独的非代码文件 xml 和 txt 文件 而不是与代码位于同一位置 我正在尝试使用includes
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • Java:在 eclipse 中导出到 .jar 文件

    我正在尝试将 Eclipse 中的程序导出到 jar 文件 在我的项目中 我添加了一些图片和 PDF s 当我导出到 jar 文件时 似乎只有main已编译并导出 我的意愿是如果可能的话将所有内容导出到 jar 文件 因为这样我想将其转换为
  • 不同类型的数组

    是否可以有一个包含两种不同类型数据的数组 我想要一个包含双精度型和字符串的数组 我尝试过 ArrayList
  • GWT - 如何组织项目以拥有多个网页以及它们之间的导航

    我是 GET 的新手 顺便说一句 它给我留下了深刻的印象 并且发现它对于像我这样熟悉 C NET 桌面技术并愿意编写 Web 应用程序的人来说非常有吸引力 我根据 GWT Eclipse 向导生成的示例启动了自己的项目 该项目生成带有面板的
  • Spring RestTemplate 使用 cookie 遵循重定向

    最近我遇到了一个问题 我需要做一个GET请求远程服务 我假设使用一个简单的 servlet 并且 RestTemplate 返回Too many redirects 经过一番调查 似乎对指定远程服务发出的第一个请求实际上只是一个 302 重
  • 在鼠标光标位置添加 cytoscape 节点

    我想在画布上的单击事件上的鼠标箭头位置添加一个 cytoscape 节点 我怎样才能做到这一点 我的方法 效果不太好 我可以通过单击创建一个节点 但无法确保创建的节点的位置位于我单击的位置 使用这样的东西 cy click function
  • 在 Wildfly 中与 war 部署共享 util jar 文件

    假设我有一个名为 util jar 的 jar 文件 该 jar 文件主要包含 JPA 实体和一些 util 类 无 EJB 如何使这个 jar 可用于 Wildfly 中部署的所有 war 无需将 jar 放置在 war 的 WEB IN
  • 是否可以通过编程方式查找 logback 日志文件?

    自动附加日志文件以支持电子邮件会很有用 我可以以编程方式设置路径 如以编程方式设置 Logback Appender 路径 https stackoverflow com questions 3803184 setting logback
  • 使用 Guice 优化注册表

    你好 今天思考了一种优化 有一些疑问 语境 我正在使用 Guice 2 进行 Java 开发 在我的网络应用程序中 我有一个转换器注册表 可以即时转换为某种类型 转换器描述如下 public class StringToBoolean im
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • 读取电子邮件的文本文件转换为 Javamail MimeMessage

    我有一个电子邮件原始来源的文本文件 直接从 gmail 复制 如果您单击 查看原始文件 您就会看到它 我想读入该文件并将其转换为 MimeMessage 如果您好奇为什么 我设置了 JavaMaildir 并且需要用电子邮件填充它的收件箱以
  • java库维护数据库结构

    我的应用程序一直在开发 所以偶尔 当版本升级时 需要创建 更改 删除一些表 修改一些数据等 通常需要执行一些sql代码 是否有一个 Java 库可用于使我的数据库结构保持最新 通过分析类似 db structure version 信息并执
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • 如何使用play框架上传多个文件?

    我在用play framework 2 1 2 使用java我正在创建视图来上传多个文件 我的代码在这里 form action routes upload up enctype gt multipart form data
  • 配置“DataSource”以使用 SSL/TLS 加密连接到 Digital Ocean 上的托管 Postgres 服务器

    我正在尝试托管数据库服务 https www digitalocean com products managed databases on 数字海洋网 https en wikipedia org wiki DigitalOcean 创建了
  • 洪水填充优化:尝试使用队列

    我正在尝试创建一种填充方法 该方法采用用户指定的初始坐标 检查字符 然后根据需要更改它 这样做之后 它会检查相邻的方块并重复该过程 经过一番研究 我遇到了洪水填充算法并尝试了该算法 它可以工作 但无法满足我对 250 x 250 个字符的数

随机推荐

  • 使用 AWS ECS 服务和 Elastic LoadBalancer 向公共公开多个端口

    我有公开多个端口的服务 它在 kubernetes 上运行良好 但现在我们将其移至 AWS ECS 看来我只能通过负载均衡器公开端口 并且每个服务 任务只能使用 1 个端口 即使 docker 定义了多个端口我也必须选择一个端口 Add t
  • 处理 nil 对象和属性的最佳实践是什么?

    说我有一个User对象 它有一个email财产 我需要他们的大写最后一个字母email u User find 1 letter u email upcase last If u or email is nil在这个链中 然后我得到一个No
  • 为什么在 Android 上重定向 stdout/stderr 不起作用?

    我下载了 SDL 1 3 并在我的 android 2 2 设备上将其与 OpenGL ES 一起进行了测试 它工作正常 但我没有得到输出printf来电 我尝试了下面的命令 如安卓开发者页面 http developer android
  • 隐藏datagridview winform中的默认灰色列

    当数据不可用时 有什么方法可以删除或隐藏 winforms datagrid 灰色区域吗 其次 如何删除 隐藏默认的灰色列 dataGridView1 DataSource oresult dataGridView1 Columns Id
  • 是否有可用的公共 UDDI 注册中心?

    我目前正在尝试掌握 UDDI 并希望使用查询 API 运行一些示例 但我找不到可以使用 SOAP 消息查询的公共注册表 IBM Microsoft 和 SAP 几年前曾托管公共 UDDI 服务器 但后来已停止使用 I know xmetho
  • 同一行上的两个 Div 并居中对齐

    我有两个像这样的div div style border 1px solid 000 Div 1 div div style border 1px solid red Div 2 div 我希望它们显示在同一行 所以我使用float lef
  • 意外的顶级错误

    我一直在尝试许多解决方案 甚至启用了 multiDexEnabled true 但仍然收到此错误 UNEXPECTED TOP LEVEL ERROR 这是我的构建 android compileSdkVersion 22 buildToo
  • C 字符串与等号的比较

    我有这个代码 char name George if name George printf It s George 我认为c字符串不能与 标志 我必须使用strcmp 由于未知原因 当我使用 gcc 版本 4 7 3 编译时 此代码有效 我
  • Web 服务必须注册吗?

    我正在学习网络服务 我读过的大多数资源都讨论了如何在网络服务准备好供其他人使用时对其进行注册 使用该服务是否需要注册网络服务 例如 假设我在公司 Intranet 上有一个 Web 应用程序 并且我创建了另一个 Web 服务应用程序 该应用
  • 在程序集“”中发现了不止一种迁移配置类型。指定要使用的名称。关于添加迁移

    在包管理器控制台中 我正在尝试更新我的数据库 当我输入这个命令时 add migration Migration1 我明白了 在程序集中发现了不止一种迁移配置类型 我的项目 POCO 指定要使用的名称 我用谷歌搜索了这个错误 我得到了这个
  • 如何从 XMLHttpRequest 获取进度

    是否可以获得 XMLHttpRequest 的进度 上传的字节数 下载的字节数 当用户上传大文件时 这对于显示进度条很有用 标准 API 似乎不支持它 但也许任何浏览器中都有一些非标准扩展 毕竟 这似乎是一个非常明显的功能 因为客户端知道上
  • sharepoint aspx 页面的隐藏代码在哪里?

    毫无疑问 我在这里遗漏了一些非常明显的东西 但我是 sharepoint 的新手 所以请耐心等待 我已经成功添加了一个母版页 创建了一个内容类型 并为我的自定义内容类型创建了一个 aspx 页面 但我找不到它的 cs 文件 在共享点解决方案
  • 扩展 maxLines 属性时自动滚动多行 TextFormField

    我正在实现一个 TextFormField 其 maxLines 属性设置为 3 当用户从第四行开始时 如何使 TextFormField 向下滚动 目前 光标不再可见 直到用户手动向下滚动 有没有办法自动执行此操作 这种行为实际上在 fl
  • 动态算法与贪婪算法:关于 Neil G 对同一主题的回答的争论

    我试图理解动态算法和贪婪算法之间的区别 并且这个答案由Neil G很有帮助 https stackoverflow com a 13713735 2715083但是 他的一句话却引起了评论区的热议 动态规划和贪心算法之间的区别在于 动态规划
  • 将字符串替换为具有不同 html 但相同文本的匹配字符串

    String1 img alt src http abcghgds com justin bieber ferns 650 430 jpg width 650 height 430 Have you seen a href http www
  • Makefile - 为什么读取命令不读取用户输入?

    我的 Makefile 中有以下代码 Root Path echo What is the root directory of your webserver Eg Server htdocs read root path echo root
  • 为什么“无法翻译 LINQ 表达式 'x'”?我没有使用“Where()”

    当我执行以下代码时 出现错误 System InvalidOperationException LINQ 表达式 DbSet Where u gt u NormalizedEmail ToLower 0 u PasswordHash Seq
  • 类实例作为静态属性

    Python 3 不允许您在其主体内引用类 方法中除外 class A static attribute A def init self 这就提出了一个NameError在第二行 因为 A is not defined 备择方案 我很快找到
  • 如何处理弹性搜索结构化查询中的通配符

    我的用例需要使用尾随通配符查询我们的弹性搜索域 我想了解您对在查询中处理此类通配符的最佳实践的看法 您认为添加以下子句对于查询来说是一个很好的做法吗 query query string query attribute postfix an
  • 检测图中的所有圆圈

    我有一个存储在 Map 数据结构中的有向图 其中键是节点的 ID value 是key节点所指向的节点的nodeId数组 Map