Erkennen von Zyklen in einem Diagramm mit DFS: 2 verschiedene Ansätze und was ist der Unterschied

Beachten Sie, dass ein graph wird dargestellt als ein angrenzens Liste.

Ich gehört habe 2 Ansätze zu finden, ein Zyklus in einem Graphen:

  1. Halten Sie ein array von booleschen Werte, um zu verfolgen, ob Sie schon einen Knoten vor. Wenn Sie neue Knoten zu gehen (ohne auf einen Knoten, der Sie bereits), dann einfach neu ansetzen und versuchen einen anderen Zweig.
  2. Der von Cormen ist CLRS oder Skiena: Für die Tiefensuche in ungerichteten Graphen gibt es zwei Arten von Kanten -, Baum-und zurück. Der graph hat einen Zyklus, wenn, und nur wenn es gibt eine back edge.

Kann jemand erklären, was sind die Kanten eines Graphen und was die diffirence zwischen den oben genannten 2 Methoden.

Dank.

Update:
Hier ist der code zum erkennen von Zyklen in beiden Fällen. Graph ist eine einfache Klasse, die repräsentiert alle graph-Knoten als eindeutige Nummern für Einfachheit, jeder Knoten hat seine angrenzenden benachbarten Knoten (g.getAdjacentNodes(int)):

public class Graph {

  private int[][] nodes; //all nodes; e.g. int[][] nodes = {{1,2,3}, {3,2,1,5,6}...};

  public int[] getAdjacentNodes(int v) {
    return nodes[v];
  }

  //number of vertices in a graph
  public int vSize() {
    return nodes.length;
  }

}

Java-code, der zum erkennen von Zyklen in ungerichteten Graphen:

    public class DFSCycle {

    private boolean marked[];
    private int s;
    private Graph g;
    private boolean hasCycle;

    //s - starting node
    public DFSCycle(Graph g, int s) {
        this.g = g;
        this.s = s;
        marked = new boolean[g.vSize()];
        findCycle(g,s,s);
    }

    public boolean hasCycle() {
        return hasCycle;
    }

    public void findCycle(Graph g, int v, int u) {

        marked[v] = true;

        for (int w : g.getAdjacentNodes(v)) {
            if(!marked[w]) {
                marked[w] = true;
                findCycle(g,w,v);
            } else if (v != u) {
                hasCycle = true;
                return;
            }
        }

    }  
}

Java-code, der zum erkennen von Zyklen in einem gerichteten Graphen:

public class DFSDirectedCycle {

    private boolean marked[];
    private boolean onStack[];
    private int s;
    private Graph g;
    private boolean hasCycle;

    public DFSDirectedCycle(Graph g, int s) {
        this.s = s
        this.g = g;
        marked = new boolean[g.vSize()];
        onStack = new boolean[g.vSize()];
        findCycle(g,s);
    }

    public boolean hasCycle() {
        return hasCycle;
    }

    public void findCycle(Graph g, int v) {

        marked[v] = true;
        onStack[v] = true;

        for (int w : g.adjacentNodes(v)) {
            if(!marked[w]) {
                findCycle(g,w);
            } else if (onStack[w]) {
                hasCycle = true;
                return;
            }
        }

        onStack[v] = false;
    }
}

InformationsquelleAutor der Frage Ivan Voroshilin | 2013-10-01

Schreibe einen Kommentar