【发布时间】:2017-02-12 07:09:49
【问题描述】:
我正在学习 Steven S. Skiena 的《算法设计手册》中的图遍历。在他的书中,他提供了使用 dfs 遍历图形的代码。下面是代码。
dfs(graph *g, int v)
{
edgenode *p;
int y;
if (finished) return;
discovered[v] = TRUE;
time = time + 1;
entry_time[v] = time;
process_vertex_early(v);
p = g->edges[v];
while (p != NULL) {
/* temporary pointer */
/* successor vertex */
/* allow for search termination */
y = p->y;
if (discovered[y] == FALSE) {
parent[y] = v;
process_edge(v,y);
dfs(g,y);
}
else if ((!processed[y]) || (g->directed))
process_edge(v,y);
}
if (finished) return;
p = p->next;
}
process_vertex_late(v);
time = time + 1;
exit_time[v] = time;
processed[v] = TRUE;
}
在无向图中,看起来下面的代码正在处理边两次(调用方法 process_edge(v,y)。一次在遍历顶点 v 时,另一次在处理顶点 y 时)。
所以我在else if ((!processed[y]) || (g->directed)) 中添加了条件parent[v]!=y。
它只处理一次边缘。但是,我不确定如何修改此代码以使用并行边缘和自循环边缘。代码应处理并行边缘和自循环。
【问题讨论】:
标签: algorithm depth-first-search