例如。对于1-> 2,2-> 3,3-> 4,4-> 2,我想要打印2,3,4。 我尝试过DFS,当我发现之前访问过的顶点时,我会转到父节点,直到我没有得到这个顶点,但它不能正常工作。有时它进入无限循环。
运行dfs:
int i;
for (i = 0; i < MAX_VER; i += 1)
if (ver[i].v == 0 && ver[i].nb > 0)
dfs(i);
DFS:
ver[v].v = 1;
int i;
for (i = 0; i < ver[v].nb; i += 1) {
ver[ver[v].to[i]].p = v;
if (ver[ver[v].to[i]].v == 0)
dfs(ver[v].to[i]);
else
// cycle found
printCycle(ver[v].to[i]);
}
和打印周期:
printf("\cycle: %d ", v);
int p = ver[v].p;
while (p != v) {
printf("%d(%d) ", p, v);
p = ver[p].p;
}
printf("\n");
顶点结构:
int *to; // neighbor list
int nb; // how many neighbor
int p; // parent
short v; // was visited? 0 = false, 1 = true
答案 0 :(得分:1)
听起来你正在寻找“强连接组件” - 所以你很幸运,有一个众所周知的算法可以在图表中找到它们。请参阅Tarjan。
该文章对该算法进行了很好的描述,但它有点长,所以我不会在这里粘贴它。此外,除非你这样做是为了学习,否则你可能最好使用现有的实现,它不是 很难实现,但 也不容易。
修改即可。看起来这个问题实际上是一个骗局...我很难说这个但是它可能需要关闭,抱歉。见Best algorithm for detecting cycles in a directed graph
答案 1 :(得分:0)
您应该使用顶点着色来避免DFS中的无限循环。 首先,所有顶点都标记为WHITE。当您第一次发现顶点(标记为白色)时,您应将其标记为灰色。如果您发现了一个GRAY顶点,您会发现一个循环。