tree - 树边缘和前边缘之间的区别

标签 tree graph-algorithm depth-first-search graph-traversal

我在看书的时候遇到了这个问题: 当在图中运行 DFS 时,如何从图中特定顶点的发现时间和完成时间来区分前向边和树边之间的差异?

到目前为止我所尝试的是:Fwd.树边是指如果A和B之间存在树边,则A是B的直接邻居,路径长度为1,但如果是Fwd。边,那么路径长度应该大于 1 左右。因此,在分析可以存储在数组中的发现时间和完成时间时,我们可以检查它们的完成/开始时间是否相差 1。因为如果相差 1,则它是树边缘,否则是前向边缘。

但是,我无法开发一种算法,并且也怀疑这种方法是否有缺陷。请帮帮我。谢谢。

最佳答案

在有向图上进行深度优先搜索时,

  1. 如果从 u 访问节点 v(v 之前未被发现)
    比 (u,v) 是树边。

  2. 否则,如果我们访问之前已经访问过的节点 v

    • 如果我们还没有离开/完成该节点(v),那么 v 肯定是 u 的祖先和 (u,v) 后边缘。

    • 否则,有两种可能性 - 横向边缘或前向边缘。在这两种情况下,我们都会访问已经离开的节点(v)。所以在这里, 我们可以通过到达时间来区分它们。

      • 它是一个前向边缘(从祖先到后代,u -> v), 如果你的到达时间会少于v

      • 如果u的到达时间大于v,则为跨边。

供引用:

void dfsEdges(struct graph*G, int v, int *visited, int *arrTime, int *depTime)
{
 static int time=0;


visited[v]=1;
arrTime[v]=time++;

struct node *temp = G->array[v];
while(temp!=NULL)
{
    if(visited[temp->val] != 1)
    {
        dfsEdges(G,temp->val,visited,arrTime,depTime);
    }
    else
    {
        if(depTime[temp->val] ==-1)
        printf("\n%d - %d is back edge\n",v,temp->val);
        else
        {
            if(arrTime[v]<arrTime[temp->val])
            printf("\n%d - %d is forward edge\n",v,temp->val);
            else
            printf("\n%d - %d is cross edge\n",v,temp->val);
        }

    }
    temp=temp->next;

}
depTime[v]=time++;

}

关于tree - 树边缘和前边缘之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29371326/

相关文章:

c - 查询连接组件数量

Clojure:删除树的所有叶子中的值

javascript - 如何将数组转换为N叉树?

r - 给定圆上的点,找到可以用穿过圆心的线分开的最少点数

algorithm - 维护没有循环或菱形的图形

c++ - LeetCode #617 "Merge Two Binary Trees"使用 C++

python-3.x - 如何实现广度优先和深度优先搜索网络爬虫?

java - 如何在java非递归中搜索一般树中的节点

algorithm - 我应该如何在 Haskell 中定义二叉树?

algorithm - 图算法?