在类似图形的对象中查找循环

时间:2016-01-09 11:09:59

标签: java algorithm recursion graph openstreetmap

我正在实现某种类似图形的对象,我现在将其描述。

我有以下对象:

节点 - 包含两个双精度(lat,lon)和两个弧(边)。 MeetingPointNode扩展节点 - 包含两个双精度(lat,lon)和八个弧。 Arc - 包含节点列表(某些常规会话点)。 环 - 包含弧列表。 (基本上它看起来像多边形)。

我有以下问题:我需要从一个随机的会员点开始并迭代,直到我回到同一个会员点或我进入死胡同(我只迭代会合点并忽略常规节点)。 以下是我尝试实现该目标的实现:

public void findRing(Node ringHead, Node current, List<Arc> arcs, Ring foundRing) {
        if (current == ringHead) {
            foundRing = new Ring();
            foundRing.setArcs(arcs);
            return;
        }

        for (int i = 0; i < 8; i++) {
           Arc currentArc = current.getArcs()[i];
           if (currentArc == null) {
                return;
           }

           arcs.add(currentArc);
           currentArc.setIsUsed(true);
           for (Node n : currentArc.getListOfNodes()) {
               if (n.getClass() != MeetingPointNode.class)
                   continue;
               findRing(ringHead, n, arcs, foundRing);

           }
           if (foundRing == null) {
              currentArc.setIsUsed(false);
              arcs.remove(current);
           }
       }
       return;
}

我将按以下格式调用该方法:findRing(head, headNext /* the next meetingPoint from head*/, new ArrayList<Arc>(), null);

我很乐意得到任何帮助。

2 个答案:

答案 0 :(得分:1)

您可以在访问时使用LinkedHashSet并存储节点。当您找到第一个副本时,您有一个Ring

LinkedHashSet保留了元素插入集合的顺序,因此您可以轻松导出Ring路径。

答案 1 :(得分:0)

如果我正确理解算法,你实际上是在使用深度优先搜索,但你想要使用的是广度优先搜索。 bfs示例: http://www.mathcs.emory.edu/~cheung/Courses/323/Syllabus/Graph/bfs.html