【问题标题】:Finding a cycle in a graph在图中找到一个循环
【发布时间】:2019-07-21 20:12:06
【问题描述】:

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

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' 为真,'1'、'2'、'4' 为假,但对于 '3' 也为真。我错过了什么?

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

【问题讨论】:

标签: c++ graph cycle


【解决方案1】:

我运行你的代码。

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

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

1) 在返回 true 之前。万一它找到了循环

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;
}

希望对您有所帮助。

【讨论】:

  • 不,对于 k=3,它仍然为 true
  • 你确定你传递了正确的数字吗?我从 k=0 到 k=5 进行了测试,并给出了 0 和 5 的真值。在通过之前打印 k,因为你的 main 有问题。
  • 检查graph[current_vertex][i] = 1; 使用current_vertex 而不是vertexcheck() 给出错误时。在那种情况下,给我 k=3 true
猜你喜欢
  • 2016-01-30
  • 2016-03-10
  • 1970-01-01
  • 2021-08-04
  • 2015-06-24
  • 2015-11-21
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
相关资源
最近更新 更多