图 - 邻接列表 C++ - 从源到目标的所有路径

Posted

技术标签:

【中文标题】图 - 邻接列表 C++ - 从源到目标的所有路径【英文标题】:Graph - Adjacency List C++ - All Paths from source to destination 【发布时间】:2016-05-04 14:05:32 【问题描述】:

我正在尝试在图中查找从源节点到目标节点的所有路径。图是有向的。我使用 C++ 对图形使用了一个相当简单的邻接表表示。 这是我用于节点的:

struct node
    
        int id;
        std::vector <int> neighbours;
    ;

邻居是您可以从节点到达的节点。

这是我用来存储整个图表的:

std::vector < node > graph;

例子:

对于上图,使用代码:

for(int i=0;i<graph.size();i++)
    
        std::cout<<graph[i].id<<"->";
        for(int j=0;j<graph[i].neighbours.size();j++)
        
            std::cout<<graph[i].neighbours[j].id;
            if(j!=graph[i].neighbours.size()-1)
                std::cout<<",";
        
        std::cout<<std::endl;
    

正确地给我所有的邻接:

0->1,4,3

1->2

2->3

3->

4->2

现在,我想写这样一个函数:

void find_paths(int start, int end)

当你给出起点和终点时,它会打印出从起点到终点的所有可能路径。

示例:当我跑步时,

find_paths(0,3):

0->1->2->3

0->4>2>3

0->3

我想要这样的输出。性能在这里并不是真正的问题。任何工作算法都可以。我可以使用什么样的算法来解决这样的问题?另外,如果没有可能的路径,我怎样才能让函数识别这个?

【问题讨论】:

如果你的图表在某处包含一个循环会发生什么?可能有无数条路径。或者路径应该是边/顶点不相交才有效?您有标签“最短路径”,但从您的示例输出来看,您还需要其他路径...所以 确切地您想要什么? 好吧,对于误导性标签,我很抱歉,我找不到或想到任何可以代表我希望在图中找到所有路径的标签。我现在确切想要的是所有从源节点到目标节点的简单路径。这意味着该路径最多应包含 n-1 条边(n 为节点数),因此在无限多路径的情况下,不应包含这些路径。 【参考方案1】:

看看Breadth first search 和Depth first search。 这两种方法都旨在以不同的顺序遍历图以找到某个节点。

要获得所有解决方案,而不仅仅是最短的解决方案,您可以保留在遍历期间导致成功的所有路径的列表。

【讨论】:

我实现了深度优先搜索,它成功了!谢谢您的帮助。 :)

以上是关于图 - 邻接列表 C++ - 从源到目标的所有路径的主要内容,如果未能解决你的问题,请参考以下文章

用C++求dijkstra算法求最短路径

对于 C++ 中的图问题,邻接列表或邻接矩阵哪个更好?

贪心算法(Dijkstra)解决单源最短路径问题(C++)

关于Dijkstra算法

将邻接列表层次结构展平为所有路径的列表

如何在intellij idea中启用从源到外部库的滚动?