所以,基本上这就是我到目前为止所拥有的。

public List<String> cycleSearch(Graph<String,String> g) throws Exception{
    List<String> list = null;
    Graph<String,String> auxG = g;
    for(String aux : g.getVertices()){
        String aux2 = aux;
        if(g.degree(aux)>1){
            if(auxG.removeVertex(aux2)){
            for(String d : g.getSuccessors(aux2)){
                for(String a : g.getSuccessors(aux)){
                    if(a!=d){
                        list = findPath(auxG,d,a);
                        if(list!=null){
                            list.add(0,aux);
                            list.add(aux);
                            return list;
                            }
                        }
                    }
                }
            }
        }
        auxG = g;
    }
    return null;
}


该方法的作用基本上是在基于JUNG的超图中搜索循环。

想法是在参数上接收图形,然后创建一个变量(相同类型),以便稍后在不对原始图形进行任何更改的情况下从其中删除顶点,以防万一找不到循环。这样,一旦顶点被删除,我就可以使用一种名为findPath(,,)的方法。该方法将“创建”另一条路径,而无需遍历移除的顶点。

我的编译器说这里有问题:

            for(String d : g.getSuccessors(aux2))


我已经用Java(JUNG)编程图形仅一个月了。
救命

最佳答案

JUNG中有一个错误已被此代码转过-如果图形没有顶点,则getSuccessors()应该返回空集合,而不是返回null,这是SetHypergraph的实现所做的。对于那个很抱歉。 (通常,可以通过将getSuccessors(x)包装在containsVertex(x)if语句中来避免这种情况。)

但是,您遇到此错误的原因是,您至少在做一些没有意义的事情:

(1)您正在将auxG分配给g(因此它们引用了相同的对象);这是一种误导,无济于事。
同样,您正在将aux2分配给aux,这也会引起误解。

(2)您要从auxG中删除aux [2],然后在auxG中请求aux2的后继者。 aux2删除后,aux2将不再具有任何继任者。

(3)由于aux2和aux是相同的顶点,出于相同的原因,您最里面的循环也不会做任何有用的事情;将没有继任者。

您需要重新考虑整个算法,因为这完全不符合设计要求。

10-07 20:30