Java中有向图中循环检测的代码简化

时间:2013-12-03 00:43:27

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

我有以下代码可以很好地检测有向图中的循环。我不喜欢的是return true出现在条件语句if (!t.isVisited && isCyclicDirected(t))中。无论true语句是否通过if,我都会返回true。我希望简化此代码以提高可读性。感谢

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

以上代码源于重构此代码

public boolean isCyclicDirected(Vertex v){
    if (v.isVisited){
        return true;
    }
    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;
}

1 个答案:

答案 0 :(得分:2)

你的while循环不是循环:在你编写的代码中,你得到一个相邻的顶点,然后你立即返回它是否是循环的,永远不会触及其他顶点:

public boolean isCyclicDirected(Vertex v){
  if (v.isVisited){
    return true;
  }

  v.setVisited(true);
  Iterator<Edge> e = v.adj.iterator();
  while (e.hasNext()) {
    Vertex t = e.next().target;

    // This while loop never goes beyond the first element.
    // you get the first vertex, then return from the
    // entire function.

    if (!t.isVisited && isCyclicDirected(t))
      return true;
    else return true;

  }
  return false;
}

你想要的是评估每个顶点,如果它们中的任何一个是可识别的循环,则返回“true”,否则耗尽你的顶点并返回“false”:

public boolean isCyclicDirected(Vertex v){
  if (v.isVisited){
    return true;
  }
  v.setVisited(true);
  Iterator<Edge> e = v.adj.iterator();
  while (e.hasNext()) {
    Vertex t = e.next().target;
    // quick test:
    if (t.isVisited) {
      return true;
    }
    // elaborate, recursive test:
    if(isCyclicDirected(t)) {
      return true;
    }
  }
  // none of our adjacent vertices flag as cyclic
  return false;
}