【问题标题】:cycle detection in undirected graph using disjointsets?使用不相交集在无向图中进行循环检测?
【发布时间】:2013-12-02 23:35:51
【问题描述】:

我正在使用不相交集的查找/联合方法在无向图中实现循环检测代码。

这里是实现:

public boolean isCyclicundirected(){
    int k;
    ArrayDisjointSet set = new ArrayDisjointSet(5);
    //Set<Vertex> parents = new HashSet<Vertex>();
    System.out.println(vertexMap);
    Set<String> allVertices = vertexMap.keySet();
    for (String v : allVertices){
        Iterator<Edge> e = vertexMap.get(v).adj.iterator();
        while (e.hasNext()){
            int i = Integer.parseInt(vertexMap.get(v).name);
            int j = Integer.parseInt(e.next().target.name);
            if (set.isConnected(i, j))
                return true;
            else
                   k = set.join(i, j);
            System.out.println(set);
    }
    }
    return false;
}

这里是disjoinset的isConnected

public boolean isConnected(int i, int j){
    return find(i)==find(j);
}

如果两个节点具有相同的根(由find 返回),则表明存在循环。 对于像这样没有循环(1,2),(2,3),(3,4) 的图,我的方法返回 true。 我不明白出了什么问题。

编辑最新:根据以下建议:

public boolean isCyclicundirected() {
    int k;
    HashSet<HashSet<Vertex>> vertexpairs = new HashSet<HashSet<Vertex>>();
    ArrayDisjointSet set = new ArrayDisjointSet(100);
    Set<String> allVertices = vertexMap.keySet();
    for (String v : allVertices) {
        Vertex current = vertexMap.get(v);
        for (Edge e : current.adj){
            Vertex nextVertex = e.target;
            HashSet<Vertex> temp = new HashSet<Vertex>();
            temp.add(nextVertex);
            temp.add(current);

            if (!vertexpairs.contains(temp)) {
                vertexpairs.add(temp);
                int i = Integer.parseInt(current.name);
                int j = Integer.parseInt(nextVertex.name);
                if (set.isConnected(i, j))
                    return true;
                else
                    k = set.join(i, j);
                System.out.println(set);
            }
        }
    }
    return false;
}

我收到node:java.util.NoSuchElementException

【问题讨论】:

    标签: java algorithm graph cycle disjoint-sets


    【解决方案1】:

    您在每条边上迭代两次,每边一次。您只需要考虑一次任何边缘。

    【讨论】:

    • 这会对循环检测产生影响吗?
    • @user1988876:是的。如果您对每条边进行两次迭代,那么您基本上是在查看图形,就好像所有边都是两条边一样。在 doubled 图中,任何一条边和它的 double 都形成一个循环。
    • 我正在考虑每个顶点,它的邻居..我必须标记访问过的节点吗?据我了解,不相交集方法不必跟踪访问过的节点。但我可能完全错了..
    • @user1988876:不。标记访问过的节点无济于事。该算法基本上是关于边,而不是顶点。如果您的图形表示不能轻松地遍历边,您可以尝试跟踪您访问过哪些边,并在第二次访问时忽略任何边。
    • 我现在包含一个字段来跟踪访问的边缘,代码在上面的编辑中更新,但现在我得到node:java.util.NoSuchElementException
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    相关资源
    最近更新 更多