Graph 像这样遍历有向图的算法(内部图片)

Graph 像这样遍历有向图的算法(内部图片),graph,traversal,Graph,Traversal,我有一个这样的图表: 一条简单的规则: 图中的每个节点只知道其后续节点 如您所见,当我们谈到6(由第一个分支1)时,问题就出现了→ 6),因此我们不知道何时停止并开始遍历另一个分支(2→ 6) 有谁能建议一个这样遍历图的算法吗 我是在遍历1时想到这个主意的→ 6.→ 结束图形,然后返回到2→ 6 但我认为这不是个好主意,因为1上可能有很多分叉→ 6.→ 图的末尾。这不是DFS搜索吗?()从根本上说,只有两种方法可以解决这个问题 当然,还有很多其他选择,但这些都是最简单、最普遍适用的。不管怎

我有一个这样的图表:

一条简单的规则:
图中的每个节点只知道其后续节点

如您所见,当我们谈到
6
(由第一个分支
1)时,问题就出现了→ 6),因此我们不知道何时停止并开始遍历另一个分支(
2→ 6

有谁能建议一个这样遍历图的算法吗

我是在遍历
1时想到这个主意的→ 6.→ 结束图形
,然后返回到
2→ 6


但我认为这不是个好主意,因为
1上可能有很多分叉→ 6.→ 图的末尾。

这不是DFS搜索吗?()

从根本上说,只有两种方法可以解决这个问题

  • 当然,还有很多其他选择,但这些都是最简单、最普遍适用的。不管怎样,其他算法基本上可以被认为是这些主题的变体。选择对你的问题最好的一个,然后去城里


    递归地,当你穿过每个节点时,你会标记它,当没有什么可供探索时,你会返回

    看起来像

    function 
    
    mark the current edge
    for all it's vertices
    call the function on the edge that is connected with the vertice if the edge is not marked
    do something with the edge (display or whatever)
    once there is no vertices left return 
    
    例如,如果图形由相邻矩阵表示,则长度为1000表示没有顶点

    void inDepth(int i)
    {
        int j;
    
        edges[i] = 1; //edges is the marking vector
    
        for (j=0; j<N; j++)
        {
            if ((vertices[i][j]<1000) && (vertices[i][j]>0) && (edges[j]==0)) 
            {
                inDepth(j); 
            }
        }
    
        printf("%d ",i);
    }
    
    void inDepth(inti)
    {
    int j;
    边[i]=1;//边是标记向量
    
    对于(j=0;jBreadth first search也可以……我认为OP并没有很好地描述这个问题。如果你想用C来做例子,可以问一下。如果你在检查所有顶点之后或之前对边做了一些事情,这就是DFS或BFS。这两种方法都不起作用。DFS:0,1,6,2,…/BFS:0(推1,2),1,(推6),2(推3),6….我否决了你的答案,因为它没有回答问题。但事实上,它仍然是最好的答案…我编辑你的答案,我将被允许取消否决…我不确定我是否遵守。OP没有给出他预期的遍历顺序。这个问题已经将近两年了,所以他不太可能更新它。嗯,你可能是对的。…我希望节点索引是预期的遍历顺序,但可能我只是这么想,因为这是我目前面临的问题。同样,如果你做任何版本,我将被允许取消向下投票。现在,我不能。我想你的意思是只处理一个节点的所有父节点。不知道父节点不是真正的p这个问题是因为计算反向边很简单:为所有节点创建一个空的“父”列表,然后为所有节点(无论顺序如何)将其id添加到其子节点的父列表中。