我一直在编写代码以获得有向图中的所有可能周期。 Here是一种跟踪后沿的实现,每当找到一个后沿时,它返回true,检测到一个周期。我把它扩展到以下内容:
计算树中所有可能的后边缘,后边缘的数量应给出周期数。不确定这是否正确。使用这个,我实现了以下内容:下面的count
变量没用。最初我有它给出每个周期的计数。但这没有给出正确的答案。但是存储所有后边缘的edgeMap
的大小似乎在某些图形中给出了正确的周期数,但并非全部。
该代码适用于图片中的G2和G3,但G1不适用。 (G1只有两个循环,但我有三个后边缘)。任何我可能出错的建议都会有所帮助
public int allCyclesDirectedmain(){
clearAll();
int count=0;
Map<Vertex, Vertex> edgeMap = new HashMap<>();
for (Vertex v : vertexMap.values()) {
if (!v.isVisited && allCyclesDirected(v,edgeMap))
count++;
}
System.out.println(edgeMap);
return count;
}
public boolean allCyclesDirected(Vertex v, Map<Vertex, Vertex> edgeMap ){
if (!v.isVisited){
v.setVisited(true);
Iterator<Edge> e = v.adj.iterator();
while (e.hasNext()){
Vertex t = e.next().target;
if (!t.isVisited && allCyclesDirected(t,edgeMap)){
edgeMap.put(v, t);
return true;
}
else
return true;
}
}
return false;
}
答案 0 :(得分:2)
备份数量不是周期数,因为单个备份可以参与多个周期。
在图表G1中,让我们从A跟踪深度优先搜索的进展:它访问A-> B-> C,然后在D和E之间进行选择。让我们假设它需要D.然后它访问E,并找到一个后备进入B.事实上,EB边缘参与BCE周期和BCDE周期!
这是另一个例子:考虑四个节点上的完整有向图。有12条边,但
总共20个周期 - 超过图中的边缘!实际上,图表中可能存在指数级的循环,以及计算它们的问题,称为#CYCLE,is not computable in polynomial time if P != NP。
答案 1 :(得分:1)
如前所述,单个后端可以贡献一个以上的周期,因此后端的数量与周期的数量不同。 可以使用约翰逊算法在图中找到所有简单的循环。