如何找到图形周期中的哪些顶点

时间:2012-05-03 08:47:13

标签: algorithm graph graph-algorithm

例如。对于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

2 个答案:

答案 0 :(得分:1)

听起来你正在寻找“强连接组件” - 所以你很幸运,有一个众所周知的算法可以在图表中找到它们。请参阅Tarjan

该文章对该算法进行了很好的描述,但它有点长,所以我不会在这里粘贴它。此外,除非你这样做是为了学习,否则你可能最好使用现有的实现,它不是 很难实现,但 也不容易。

修改即可。看起来这个问题实际上是一个骗局...我很难说这个但是它可能需要关闭,抱歉。见Best algorithm for detecting cycles in a directed graph

答案 1 :(得分:0)

您应该使用顶点着色来避免DFS中的无限循环。 首先,所有顶点都标记为WHITE。当您第一次发现顶点(标记为白色)时,您应将其标记为灰色。如果您发现了一个GRAY顶点,您会发现一个循环。