【问题标题】:code for cycle detection is not finding returning the right number of cycles in directed graph in Java?循环检测代码没有找到在 Java 中的有向图中返回正确的循环数?
【发布时间】:2013-12-12 05:25:07
【问题描述】:

我编写了代码,用于使用DFS 计算有向图中的循环数。检查循环是否存在的方法工作正常。我现在遍历所有顶点(我在 HashMap 中)并检查一个顶点是否未被访问,然后检查是否存在一个循环,如果存在则将计数器加 1。现在代码中断,它没有给出正确的数字循环例如:对于具有以下边的图:

(A B),(B C),(C E),(E A),(B E)

这是我的代码;

public int getTotalCyclesinDir(){
    clearAll();
    int count=0;
    for (Vertex v : vertexMap.values()) {
        if (!v.isVisited && isCyclicDirected(v))
            count++;
    }
    return count;
}

public boolean isCyclicDirected(Vertex v){
    if (!v.isVisited){
        v.setVisited(true);
        Iterator<Edge> e = v.adj.iterator();
        while (e.hasNext()){
            Vertex t = e.next().target;
            if (!t.isVisited) {
                if (isCyclicDirected(t))
                    return true;
            }
            else return true;
        }
        return false;
    }
    else return true;
}

【问题讨论】:

  • 你期望哪个数字,算法返回什么?
  • 我期望 2 因为有两个周期,但它只返回一个
  • 另外,我发现我的isCyclicDirected 方法中有太多的返回语句。有没有办法简化它?
  • 如果您需要其他部分代码,我可以添加它们
  • 在 if / else 中,我会先把短大小写放在首位,特别是如果这样可以避免一个 not。此外,如果您有条件地返回,那么之后您就不需要明确的 else。

标签: java graph depth-first-search directed-graph cyclic-graph


【解决方案1】:

你的算法至少有两个问题:

  • isCyclicDirected只是检测图中是否有循环。您不能直接使用它来计算周期。例如,您的算法将计算 (A B) (B A) (C A) 中的两个周期,因为 (C A) 连接到访问节点。

  • 如果您想在示例中检测两个循环,您的检测需要基于边缘而不是基于顶点。 (B E) 形成一个循环,但 B 和 E 都被标记为从以前的运行中访问过。

【讨论】:

  • 我明白你的意思。 1)你所说的基于边缘是什么意思,你能详细说明一下吗2)在isCyclicDirected方法中,我有太多的回报,是所有必要的还是有任何简化的余地..谢谢
  • 假设有一条河,你想计算桥梁。您从桥的一侧开始,并将海岸标记为已访问。然后你过桥并将另一侧标记为已访问。然后你得出结论,只有一座桥,因为你已经访问了两边。
  • 我对代码进行了更改并以不同的方式实现以跟踪边缘。我仍然有一些问题,我在这里发布..stackoverflow.com/questions/20253255/…
猜你喜欢
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
相关资源
最近更新 更多