未加权无向图中的最长路径

2024-02-29

以此图作为参考,假设我想要 0 到 5 之间的最长路径。

那将是:0->1->3->2->4->6->5

有什么好的算法吗?我已经搜索过,但没有找到任何我能理解的东西。 我发现了很多最短路径的算法(0->1->2->4->6->5)并且我已经成功地实现了它们。 也许我是问题所在,但我想否则:)

欢迎任何帮助


这个问题是 NP 困难的(从哈密顿路径到您的问题有一个简单的简化,并且哈密顿路径搜索已知是 NP 困难的)。这意味着这个问题没有多项式解(除非 P = NP)。

如果您需要精确的解决方案,您可以使用动态规划(具有指数数量的状态):状态为(mask of visited vertices, last_vertex),该值是 true 或 false。过渡是添加一个不在原点中的新顶点mask如果之间有一条边last_vertex和新的顶点。它有O(2^n * n^2)时间复杂度还是比O(n!)回溯。

这是动态规划解决方案的伪代码:

f = array of (2 ^ n) * n size filled with false values
f(1 << start, start) = true
for mask = 0 ... (1 << n) - 1:
    for last = 0 ... n - 1:
        for new = 0 ... n - 1:
            if there is an edge between last and new and mask & (1 << new) == 0:
                f(mask | (1 << new), new) |= f(mask, last)
res = 0
for mask = 0 ... (1 << n) - 1:
    if f(mask, end):
        res = max(res, countBits(mask))
return res

关于从哈密顿路径简化到这个问题的更多信息:

def hamiltonianPathExists():
    found = false
    for i = 0 ... n - 1:
        for j = 0 ... n - 1:
            if i != j:
                path = getLongestPath(i, j) // calls a function that solves this problem
                if length(path) == n:
                    found = true
    return found

这是一个 Java 实现(我没有正确测试,因此它可能包含错误):

/**
 * Finds the longest path between two specified vertices in a specified graph.
 * @param from The start vertex.
 * @param to The end vertex.
 * @param graph The graph represented as an adjacency matrix.
 * @return The length of the longest path between from and to.
 */
public int getLongestPath(int from, int to, boolean[][] graph) {
    int n = graph.length;
    boolean[][] hasPath = new boolean[1 << n][n];
    hasPath[1 << from][from] = true;
    for (int mask = 0; mask < (1 << n); mask++)
        for (int last = 0; last < n; last++)
            for (int curr = 0; curr < n; curr++)
                if (graph[last][curr] && (mask & (1 << curr)) == 0)
                    hasPath[mask | (1 << curr)][curr] |= hasPath[mask][last];
    int result = 0;
    for (int mask = 0; mask < (1 << n); mask++)
        if (hasPath[mask][to])
            result = Math.max(result, Integer.bitCount(mask));
    return result;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未加权无向图中的最长路径 的相关文章

  • C++中向量是如何实现的

    我正在考虑如何实施std vector从头开始 它如何调整向量的大小 realloc似乎只适用于普通的旧结构 还是我错了 它是一个简单的模板类 它包装了一个本机数组 它does not use malloc realloc 相反 它使用传递
  • 透明平开窗

    我有一点JWindow上面有一个标志 用户可以将东西拖到上面 我主要在 OS X 上开发我的应用程序 为了获得我使用的透明窗口 setBackground new Color 0 0 0 0 在 Mac 上 这工作得很好 但在 Window
  • 多线程环境下如何更好的使用ExecutorService?

    我需要创建一个库 其中包含同步和异步方法 executeSynchronous 等待直到有结果 返回结果 executeAsynchronous 立即返回一个 Future 如果需要 可以在其他事情完成后进行处理 我的图书馆的核心逻辑 客户
  • 在Java中清空数组/处理

    除了循环遍历数组中的每个元素并将每个元素设置为 null 之外 Java 处理中是否有一个本机函数可以简单地清空数组 或销毁它 以便能够将其重新声明为新数组 There s Arrays fill myArray null 并不是说它执行的
  • Javadoc 1.5 和 1.6 中缺少 enum.valueOf(String name)

    这可能是一个愚蠢的问题 但我正在使用该方法enum valueOf String name 那里没问题 只是当我检查 javadoc 以了解有关此方法的更多信息时 我找不到它 有javadoc用于valueOf Class
  • 使用 Android WebViewClient 启用特定 SSL 协议

    我的应用程序使用WebViewClient与服务器建立 SSL 连接 服务器配置为仅接受 TLSv1 1 及以上协议 使用 Android 时 如何检查哪些 SSL 协议是 a 支持的和 b 默认启用的WebViewClient在设备上 如
  • 在 TestNG 中运行多个类

    我正在尝试自动化一个场景 其中我想登录一次应用程序 然后进行操作而无需再次重新登录 考虑一下 我有在特定类的 BeforeSuite 方法中登录应用程序的代码 public class TestNGClass1 public static
  • 如何修复 Android 7.0 的 Spinner 模式下的 DatePickerDialog?

    我目前正在开发一个简单的项目 其中包含一个包含在 Web 视图中的网站 具有少量交互 以提高网站本身和 Android 移动设备之间的交互性 由于该网站包含用户生日的日期输入字段 因此我希望实现一个与所有设备兼容的旋转格式的日期选择器 我尝
  • 支持通过 OAuth 进行 Facebook/Twitter 身份验证的 CAS 服务器

    我正在寻找一个支持 Facebook Twitter 通过 OAuth 进行单点登录身份验证的 CAS 服务器 我检查过 JASIG CAS 服务器 但它看起来不支持它们 我的 java web 应用程序基于 Spring Security
  • 打印 jasper 文件时执行报表 SQL 语句时出错

    我修改了一个旧项目 但无法确定这段代码有什么问题 使用下面的 jrxml它创造 jasper文件 当我打印 jasper 文件时 使用此代码JasperPrint jasperPrint JasperFillManager fillRepo
  • Java元数据读写

    是否可以以通用方式 对于所有图像类型 在 Java 中读取和写入元数据 我找到了一些示例 但它们总是特定的 例如 JPEG 或 PNG 我需要一些足够通用的东西 而不是到处都有 if else 语句 我不想重写源代码 但这是一个很好的例子
  • SimpleDateFormat 将 lenient 设置为 false 时出现异常

    为什么这段代码会抛出无法解析日期的异常 SimpleDateFormat f new SimpleDateFormat yyyy MM dd T HH mm ss 000Z f setLenient false String dateStr
  • 如何使用 Guava 连接字符串?

    我写了一些代码来连接字符串 String inputFile for String inputLine list inputFile inputLine trim 但我不能使用 连接 所以我决定使用 Guava 所以我需要使用Joiner
  • 战争库中的罐子爆炸

    我们可以将分解的 jar 文件放入 war web inf 库中吗 它在 JBOSS 4 2 中对我不起作用 我收到以下错误并且无法部署应用程序 Caused by javax management RuntimeOperationsExc
  • scala中的协变类型参数需要在java接口中保持不变

    我有一个看起来像这样的特征 一些进一步的信息可以在我自己提出了这个相关问题 https stackoverflow com questions 3695990 inheritance and automatic type conversio
  • Google Cloud Messaging - 立即收到或长时间延迟收到的消息

    我在大学最后一年的项目中使用谷歌云消息传递 一切正常 但我在使用 GCM 时遇到了一些麻烦 通常 消息要么几乎立即传递 要么有很大的延迟 我读过这篇文章 但我真的认为它不适用于这种情况 GCM 通常会在消息发送后立即传送消息 然而 这并不总
  • 如果抛出RuntimeException,是否可以将其作为异常捕获?

    如果我有一个try抛出一个块RuntimException子类 可以是后续的catch块将其捕获为Exception 具体来说 public class MyAppException extends RuntimeException In
  • 如何从spark中的hbase表中获取所有数据

    我在 hbase 中有一个大表 名称为 UserAction 它具有三个列族 歌曲 专辑 歌手 我需要从 歌曲 列族中获取所有数据作为 JavaRDD 对象 我尝试了这段代码 但效率不高 有更好的解决方案来做到这一点吗 static Spa
  • 使用 Runtime.getRuntime().exec() 进行重定向不起作用

    我需要从程序执行命令 命令行是可以的 我在终端试了一下 但是在程序中不行 我从我的代码中添加一个副本 File dir new File videos String children dir list if children null Ei
  • H2 用户定义的聚合函数 ListAgg 不能在第一个参数上使用 DISTINCT 或 TRIM()

    所以我有一个 DB2 生产数据库 我需要在其中使用可用的函数 ListAgg 我希望使用 H2 的单元测试能够正确测试此功能 不幸的是H2不直接支持ListAgg 但是 我可以创建一个用户定义的聚合函数 import java sql Co

随机推荐

  • 提取并添加链接到字符串中的 URL [重复]

    这个问题在这里已经有答案了 可能的重复 如何用链接替换普通 URL https stackoverflow com questions 37684 how to replace plain urls with links 我有几个带有链接的
  • Orchard CMS 是否支持带有实体框架的 MVC4

    我有一个使用 MVC4 Entity Framework 4 4 构建的站点 有2个项目 即 一个是关于我们的网站的 另一个是类库 定义为 edmx 这次我们需要将其迁移以支持CMS 并且 我们选择使用 Orchard CMS 我需要知道
  • 同时使用 GPRS 和 GSM

    我正在尝试使用 GSM GPRS 调制解调器的 GPRS 功能将数据发送到远程服务器 但我无法这样做 我在 Arduino 论坛上发布了一个问题 但没有得到任何回复 这是问题的链接 https robotics stackexchange
  • Spark - Java UDF 返回多列

    我正在使用 SparkSql 1 6 2 Java API 我必须处理以下 DataFrame 该 DataFrame 在 2 列中具有值列表 ID AttributeName AttributeValue 0 an1 an2 an3 av
  • 如何在WebView上显示加载图像或进度条

    我在 android 中有一个加载特定站点的 webView 我想在单击 webView 内的任何链接时显示加载图标或进度条 webViewClient WebView findViewById R id contentContainer
  • 没有找到适合实体类型 HierarchyId 的构造函数

    我在 DotNet core 3 1 中工作 需要使用层次结构 我必须在表中使用 HierarchyId 并且我使用 Code First 但是当我尝试执行时添加迁移它返回此错误 找不到实体类型 HierarchyId 的合适构造函数 以下
  • SQL Server BULK INSERT CSV 文件时出现(“IID_IColumnsInfo”)错误

    我是 SQL Server 新手 所以请原谅我在这里有点菜鸟 此处显示的代码返回以下错误 无法从链接服务器 null 的 OLE DB 提供程序 BULK 获取所需的接口 IID IColumnsInfo Code BULK INSERT
  • 限制 Node JS Express 中的 api 访问

    我有一个带有一些 API 路由的 Express 服务器 如下所示 server post api send email req res gt 您不需要身份验证令牌即可访问 API 但我只想要我的网站mydomain com才能使用它 我尝
  • 类型推断和借用与所有权转移

    我正在学习 Rust 并且遇到了一些令人困惑的行为 以下代码可以正常编译并按预期工作 edit 添加了测试函数以外的代码 之前省略 struct Container lt a gt contents a mut i32 fn main le
  • 将 IFORT 与 nvcc 和 CUSP 结合使用的未解决的引用

    我有一个正在编译的程序 如下所示 Some ifort f c nvcc c src bicgstab cu o bicgstab o I home ricardo apps cusp cusplibrary Some more for c
  • 计数排序的时间复杂度

    I am taking an algorithms course and there I saw that the time complexity of counting sort is O n k where k is the range
  • 出现错误 -->“任务执行失败”>NDK 未配置

    我正在尝试在 android studio 上编译我的代码 但我陷入了这一点 我没有任何东西可以使用 ndk 进行编译 但每次编译都会因此错误而失败 当我检查workspace xml时 它包含compileDebugNdk和compile
  • 如何在 swift 中为枚举添加更多案例

    我正在尝试在 Swift 中实现以下目标 向枚举添加更多案例 而不是编辑现有案例 例如 我有以下枚举 我想使用扩展添加更多案例 而不是在原始枚举上进行编辑 enum UIType String Codable case borderButt
  • canvas html5 中的透明度 context.fill 样式 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我写了这段 JavaScript 代码 context shadowOffsetX 5 context shadowOffsetY 5 co
  • 重复数组的每个值不同的时间

    Suppose a 0 1 0 2 0 3 0 4 0 5 0 6 and s 3 3 9 3 6 3 我正在寻找重复的最佳方式a i 确切地s i 次 然后有一个扁平数组 其形式为b 0 1 0 1 0 1 0 2 0 2 0 2 0 3
  • SSIS 包相对于 Windows 预定 exe 的优势

    我在Windows调度程序下配置了一个exe 用于对一组数据执行及时操作 该exe调用存储过程来检索数据并执行一些计算并将数据更新回不同的数据库 我想知道 使用 SSIS 包相对于预定的 exe 有什么优点和缺点 您的意思是使用 SQL S
  • 添加 UIImage 会忽略 UIImageView 框架并调整其大小

    我目前正在尝试将图像添加到一个视图的导航项中 在视图的viewDidLoad 使用以下代码调用函数 类似于这个帖子 https stackoverflow com questions 24803178 swift navigation ba
  • 虚拟主机无法使用 XAMPP 服务器创建

    我在 httpd vhost conf 文件中添加以下代码
  • 最新SDK的SDKROOT路径

    我正在使用 Xcode 构建旧代码并指定SDKROOT Developer SDKs MacOSX HOST VERSION sdk 我想为系统上预安装 的最新 SDK 指定 SDKROOT 例如我在10 8已经并且我想指定SDKROOT与
  • 未加权无向图中的最长路径

    以此图作为参考 假设我想要 0 到 5 之间的最长路径 那将是 0 gt 1 gt 3 gt 2 gt 4 gt 6 gt 5 有什么好的算法吗 我已经搜索过 但没有找到任何我能理解的东西 我发现了很多最短路径的算法 0 gt 1 gt 2