C++ DFS with stack,用于在有向、无环、无权图中查找从某个节点开始的最长路径长度

C++ DFS with stack,用于在有向、无环、无权图中查找从某个节点开始的最长路径长度,c++,algorithm,graph,tree,depth-first-search,C++,Algorithm,Graph,Tree,Depth First Search,我试图找到一种实现DFS搜索的方法,通过使用堆栈,而不是使用递归,在表示为邻接列表的有向图上找到从给定节点开始的最长路径的长度。具体地说,我希望实现DFS搜索,以便在运行时,如下图所示填充堆栈 如果还不清楚的话,这段视频是我希望在程序运行时如何构建堆栈的(DFS大约在12:45开始: 但我正在努力找到一种方法来实现这一点,因为我对编程总体来说还是相当陌生。我当前的代码将图形表示为无序映射,每个条目包含指向它的所有节点的向量。例如: std::unordered_map<long, std:

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

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

std::unordered_map<long, std::vector<long>> nodes;
std::无序映射节点;
基本上,我想从所有节点执行DFS搜索,在无序的_图中键值为-1,如图和视频所示,堆栈分配如图所示。我在想,这样我就可以记录堆栈达到其最大大小时,这将是最长的路径


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

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

但是,请注意,具有
N
节点的DAG可能具有
O(2^(N/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--;
  }
}

const int n=100;
向量图[n];
int ans=0,级别=0;
int-vis[n];
无效dfs(int src){
级别++;
ans=最大值(水平,ans);
对于(int x:graph[src]){
如果(vis[x])继续;
vis[x]=1;
dfs(x);
级别--;
}
}
我硬编码了n的值,你可以根据需要改变它的结构

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


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

按每个节点有关最长路径的信息-您是指从该节点开始的最长路径?还是总的来说?我相信您需要(每个节点):当前最长路径长度,以及提供该路径的节点的反向链接。这取决于运行程序所需的内存资源以及其他变量占用的内存。