在图中查找循环

Finding a cycle in a graph

我想编写一个代码,用于在给定的有向矩阵形式的有向图中查找固定长度的循环

bool check(int vertex,int current_vertex, int k, int** graph , int n) {
if (k == 0)
    return (vertex == current_vertex);
for (int i = 0; i < n; i++) {
    if (graph[current_vertex][i] == 1) {
        graph[current_vertex][i] = 0;
        if (check(vertex, i, k - 1, graph, n)) return true;
        graph[vertex][i] = 1;
    }
}
return false;
}

从 main 调用函数:

    for (int i = 0; i < n; i++) {
        cycle = check(i,i,k,graph,n);
        if (cycle) break;
    }
    cout << (cycle?"TRUE":"FALSE");

我的输入在下面给出,只有一个循环,正如预期的那样,它对“5”给出 true,对“1”、“2”、“4”给出 false,但对“3”也给出 true。我错过了什么?

0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
1 0 0 0 0

我运行你的代码。

您在访问图表时正在更改图表。这会给您带来不可预测的结果。

当您将边缘设置为已访问时,您必须将该边缘设置回其原始值。

1) 在你之前 return 是的。万一它找到循环

2) 在完成循环后转到下一个顶点之前(您使用的是 vertex 而不是 current_vertex

这是您的函数的有效实现。

bool check(int vertex,int current_vertex, int k, int** graph , int n) {
    if (k == 0)
        return (vertex == current_vertex);
    for (int i = 0; i < n; i++) {
        if (graph[current_vertex][i] == 1) {
            graph[current_vertex][i] = 0;
            if (check(vertex, i, k - 1, graph, n)){
                graph[current_vertex][i] = 1;
                return true;
            }
            graph[current_vertex][i] = 1;
        }
    }
    return false;
}

希望对您有所帮助。