【问题标题】:DFS with stack to find length of longest path from a certain node in a directed, acyclic, unweighted graph带堆栈的 DFS 在有向、非循环、未加权图中查找某个节点的最长路径长度
【发布时间】:2020-10-13 03:07:02
【问题描述】:

我正在尝试找出一种方法来实现 DFS 搜索,以通过使用堆栈而不是使用递归来查找表示为邻接列表的有向图上给定节点的最长路径的长度。具体来说,我想实现 DFS 搜索,以便在它运行时填充堆栈,如下图所示..

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

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

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

需要注意的是,这个特定问题中的图表是每条边只有一个出局度,如图所示。。这是可能的,还是我必须使用某种递归来做我想做的事?提前感谢您的帮助。

【问题讨论】:

    标签: c++ algorithm graph tree depth-first-search


    【解决方案1】:

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

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

    为此,您需要标记已处理的节点。此外,由于您正在寻找 最长 路径,因此您需要跟踪有关迄今为止找到的最长路径的每个节点的信息。

    【讨论】:

    • 按每个节点有关最长路径的信息 - 您是指从那个节点开始的最长路径吗?还是整体?
    • 我相信您将需要(每个节点):当前最长路径长度,以及到提供该路径的节点的反向链接。
    【解决方案2】:

    虽然可以在不递归的情况下实现这一点,但作为替代方案,我建议您以这种方式设计一个函数,这需要您编写更少的代码,并提供很好的直觉来理解这个算法,因为您是一个初学者。而且您无需考虑自己创建堆栈

    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(V+E) 中工作。

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

    【讨论】:

    • 嗯,这取决于你有多少内存资源来运行你的程序以及其他变量占用了多少内存。
    猜你喜欢
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    相关资源
    最近更新 更多