在有向图上进行深度优先搜索时,
如果从 u 访问一个新节点 v(v 之前没有被发现),
则 (u,v) 是树边。
否则,如果我们访问之前已经访问过的节点 v
如果我们还没有离开/结束那个节点(v),那么 v 肯定是 u 的祖先,而 (u,v) 是后边。
否则,有两种可能性 - 交叉边缘或向前边缘。在这两种情况下,我们都会访问一个我们已经离开的节点(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++;
}