所以,基本上这是我到目前为止的。
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;
}
该方法的作用基本上是在基于荣格的超图中搜索一个周期。
想法是在参数上收到图形,然后创建一个变量(作为同一类型)以稍后从其上删除顶点而不在原始图上进行任何更改,以防万一找不到周期。这样一旦删除顶点后,我就可以使用一种称为FindPath(,,)的方法。该方法将"创建"另一条路径,而无需穿过删除的顶点。
我的编译器说这里有问题:
for(String d : g.getSuccessors(aux2))
我在Java(Jung)的编程图表仅1个月。帮助
jung中有一个错误,该代码已经转动 - getSuccessors()应该返回一个空集合,如果图形没有顶点,而不是返回null,这就是什么Sethypergraph的实现确实如此。对于那个很抱歉。(通常,您可以通过在containsVertex(x)If语句中包装getuccessors(x)来避免这种情况。)
但是,您遇到此错误的原因是您至少要做几个没有意义的事情:
(1)您将auxg分配给g(因此他们引用了同一对象);这是误导性的,没有帮助。同样,您将AUX2分配给AUX,这也是误导的。
(2)您正在从AUXG中删除AUX [2],然后要求AUX2的继任者在AUXG中。AUX2删除后AUX2将不会有任何继任者。
(3)由于AUX2和AUX是相同的顶点,因此您最内向的循环也不会出于相同的原因做任何有用的东西;不会有继任者。
您需要重新考虑整个算法,因为这根本不正确。
,而不是使用null
代表不代表后继者,您可以只使用一个空列表,从而避免使用NullPointerException
。用return new LinkedList<>();
替换return null;
。