나는 방향성 그래프에서 가능한 모든 사이클을 얻기 위해 코드를 작성 해왔다. Here은 뒤쪽 가장자리를 추적하고 하나의 뒤쪽 가장자리가 발견 될 때마다 하나의주기가 감지되었다는 사실을 반환하는 구현입니다. 이것을 다음과 같이 확장했습니다 : 트리에서 가능한 모든 뒤쪽 가장자리를 계산합니다. 뒷쪽 가장자리의 수는 순환 횟수를 제공해야합니다. 이것이 맞는지 확실하지 않습니다. 이를 사용하여 다음을 구현했습니다. count
변수는 유용하지 않습니다. 처음에 나는 각 사이클 수를 알려주도록했다. 그러나 그것은 정답을주지 않습니다. 그러나 모든 뒤쪽 가장자리를 저장하는 edgeMap
의 크기는 일부 그래프에서는 정확한 수의 사이클을 제공하지만 전부는 아닙니다.방향성 그래프의 사이클 수를 얻기 위해 모서리를 뒤집는다.
코드는 그림에서 G2와 G3에서 작동하지만 G1에서는 실패합니다. (G1에는 2 사이클 밖에 없지만 3 개의 뒷 모서리가 있습니다.) 하나의 backedge 하나 이상의주기에 참여할 수 있기 때문에 내가 잘못 갈 수있는 곳의 제안은,
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;
}
나는 알려진 해결책으로 이미 사소한 문제를보고 있다고 생각합니다. SO에서 이전 답변을 보셨습니까? 예를 들면 다음과 같습니다. http://stackoverflow.com/questions/546655/finding-all-cycles-in-graph 거기에있는 답변 중 하나는주기 계산을위한 Java 알고리즘을 말합니다. http://normalisiert.de/code/ java/elementaryCycles.zip –
@Ricardo : 나는 그것을 보았다. 사소한 일이 아니다. 나는 동의한다. Himadri Choudhury가 제공 한 링크에 게시물이 있습니다. 그 해결책은 우아 해 보이지만 분명하지는 않습니다. 나는 거기에 메모를 남겼지 만 아무도 대답하지 않았습니다. –