当前位置: 首页 > 知识库问答 >
问题:

带堆栈的DFS,用于在有向、无环、无加权图中从某个节点找到最长路径的长度

狄溪叠
2023-03-14

我试图找到一种实现DFS搜索的方法,通过使用堆栈,而不是使用递归,在表示为邻接列表的有向图上找到从给定节点开始的最长路径的长度。具体地说,我希望实现DFS搜索,以便在运行时,如下图所示填充堆栈。。

如果这还不清楚的话,这段视频是我希望在html" target="_blank">程序运行时如何构建堆栈的(DFS大约在12:45开始:https://www.youtube.com/watch?v=pcKY4hjDrxk 但我正在努力找到一种方法来实现这一点,因为我对编程总体来说还是相当陌生。我当前的代码将图形表示为无序映射,每个条目包含指向它的所有节点的向量。例如:

std::unordered_map<long, std::vector<long>> nodes;

基本上,我想从所有节点实现DFS搜索,在无序的_图中键值为-1,如图和视频所示,堆栈分配如图所示。我在想,这样我就可以记录堆栈何时达到其最大大小,这将是最长的路径。

共有2个答案

冀望
2023-03-14

虽然没有递归也可以实现这一点,但作为一种选择,我建议你这样设计一个函数,这需要你写更少的代码,这将为初学者提供理解这个算法的良好直觉。你不需要考虑自己创建堆栈

const int n = 100;
vector< int > graph[n];
int ans = 0, level = 0;
int vis[n];
void dfs(int src) {
  level++;
  ans = max(level, ans);
  for (int x: graph[src]) {
    if(vis[x]) continue;
    vis[x] = 1;
    dfs(x);
    level--;
  }
}

我硬编码了n和图形的值,你可以根据需要根据需要改变它的结构。

我们利用程序为递归树创建的堆栈的优势。对于给定的V节点和E边图,此函数将在O(ve)中工作。

请注意,如果图形太大,以至于程序默认创建的堆栈无法处理,那么您仍然需要编写自己的堆栈来处理递归。

韦飞尘
2023-03-14

您可能可以使用任务列表而不是递归。如果您像队列一样以FIFO顺序使用任务列表,则会得到广度优先搜索;如果你像堆栈一样使用后进先出,你会得到深度优先的行为。

但是,请注意,具有N节点的DAG可能具有O(2^(N/2))可能的路径!不过,您不需要评估所有可能的路径来解决问题,所以请注意不要编写可能需要指数时间的算法。

为此,需要标记已处理的节点。此外,由于要查找最长路径,因此需要跟踪每个节点到目前为止找到的最长路径的相关信息。

 类似资料:
  • 我试图将这个问题概念化,然后为它编写Java代码。我知道这里有一些讨论,但我没有看到很多回答者,所以我想通过写下我的想法来重申这个问题,我希望从你们那里得到一些反馈。谢谢 我的想法:对于每个叶节点,找到从根节点到它的最长路径。对于所有路径,找到最大路径长度 然而,这不就是蛮力吗,对此还有更优雅的解决方案吗? 我听说过使用Djikstra的负权重算法,但在某些地方它说这只适用于特定情况?我也看到了关

  • 我遇到了一个问题,我必须找出给定图形中的最长路径。我有一个边列表(例如,{AB,BC}),它表明在顶点/节点(A,B,C)之间有一条边。现在我想计算出可能的最长路径(不重复顶点),这样它可以覆盖从任何顶点/节点开始的最大节点。 解决这个问题的最佳方法是什么?我必须把它作为一个计划来实施。 我在谷歌上查找最小生成树、Dijkstra的算法等等。但我想不出什么最适合解决这个问题。 任何帮助或阅读参考资

  • 我需要为一组有向无环图找到从节点 0 开始的最长路径。我正在使用维基百科中的最长路径问题算法。我已经让算法适用于大多数图形,但对于其他图形,它没有给出正确的结果。算法为: 图形实现使用邻接列表来存储图形。如果我传递一个图,例如: 我得到的答案5,这是正确的。但是,如果我通过图表: 然后我得到2,而正确答案应该是3。 我使用的TopSort2算法是: DFS 算法包括:

  • 或者代码在这里。 与向量、堆栈、对相关的错误: 程序.cpp: 在函数“标准::p航空 dfs(int)”中: 过程.cpp:32:29: 错误: 请求在 “adj.std::向量中的成员 ”大小” 请帮我纠正这些。

  • 我需要找到图中最长的路径基于边权值。对于图像上的图,它应该是4,5,3,2,1(顺序无关紧要),最好的算法是什么?如果您知道,在您的图中,每个节点都有一个对图中任何其他节点的引用(边)。算法应该改变吗?

  • 我想在有向(无环)图中找到最长的路径。假设我知道起始节点-汇。路径应该从这一点开始。我在想我可以将边的权重设置为-1。有很多方法可以找到所有最短的路径,但你必须通过终点。有没有可能得到最短的路径(无论最终节点如何)? 假设我想为节点 nr 1(汇)找到最长路径。所以这个算法给了我1-2-3-4-5-6。