2017-11-05 2 views
0

(Quelle, Ziel) und es ist Typ (Baum, zurück, vorwärts, Kreuz)?Ändern der Tiefensuche zuerst

+0

haben Sie selbst versucht zu tun, vor allem versuchen, Ihren Code zu setzen, wenn Sie –

+3

Durch die Erinnerung versucht haben, wo man herkommt. Fügen Sie bitte einen Code für eine Tiefensuche zu Ihrer Frage hinzu und wir werden es von dort aus nehmen. –

+0

Ihre bearbeitete Frage ist noch weniger verständlich als das Original. Bitte erläutern Sie * in Worten *, was Sie zu tun versuchen. Und wenn Sie wissen möchten, wie Sie Code ändern können, müssen Sie den Code anzeigen, den Sie ändern möchten. –

Antwort

0

Schöne Frage.

Dies ist die Lösung basierend auf the source you posted as comment. wichtig: Es ist ein Fehler auf dem Start/Ende-Tabelle sollte dritte Reihe dritte Spalte sein "end [u] < Ende [V]" anstelle von "end [u]> Ende [V]"

void main(G, s){ 
     for each node v in G{ 
      explored[v]=false 
      parent[v]=null 
      start[v]=end[v]=null 
     } 
     Global clock = 0 
     DFS(G, s, s) 
    } 

    void DFS(G, s, parent){ 
     explored[s] = true; 
     parent[s] = parent 

     start[s]=clock 
     clock++ 

     for each u=(s,v){ 
      if(explored[v] == false){ 
       DFS(G, v) 
      } 
      print (s + "-->" + v +"type: " + getType(s,v)) 
     } 

     end[s]=clock 
     clock++ 
    } 

    String getType(s, v){ 
     if(start[s]<start[v]){ 
      if(end[s]>end[v]) return "Tree edge" 
      else return "Forward edge" 
     else{ 
      if(end[s]<end[v]) return "Back edge" 
      else return "Cross edge" 
     } 
    } 
+0

Das sieht richtig aus. Ein wichtiger Teil ist jedoch die Implementierung von "isOneOfParents" (Vorfahren, die ich vermute) in O (1). [Es ist möglich] (http://www.cs.yale.edu/homes/aspnes/pinewiki/DepthFirstSearch.html), wenn wir die Eintritts- und Austrittszeiten in jedem Eckpunkt speichern. – Gassa

+0

Die erste Implementierung, die ich für isOneOfParents (ja, Vorfahren) dachte, war O (maximale Tiefe des Baumes). Mit Ihrer Quelle werde ich versuchen, es zu machen O (1) –

+0

Ok. Dank [Ihrer Quelle] (http://www.cs.yale.edu/homes/aspnes/pinewiki/DepthFirstSearch.html) habe ich die Verwendung des Timers überlebt. Ich bearbeite die Antwort, um sie hinzuzufügen. –

2

Hier gehts. Code in Java

import java.util.ArrayList; 
import java.util.List; 

class Node { 
    public String name; 
    public List<Node> connections = new ArrayList<>(); 
    boolean visited = false; 

    Node(String name) { 
     this.name = name; 
    } 
} 

class DFS { 
    // Main part. 
    public static void search(Node root) { 
     if (root == null) { 
      return; 
     } 
     root.visited = true; 
     for (Node node : root.connections) { 
      if (!node.visited) { 
       // Print result. 
       System.out.println(root.name + "->" + node.name); 
       search(node); 
      } 
     } 
    } 
} 

public class App { 

    public static void main(String[] args) { 
     Node a = new Node("a"); 
     Node b = new Node("b"); 
     Node c = new Node("c"); 
     Node d = new Node("d"); 
     Node e = new Node("e"); 

     a.connections.add(b); 

     b.connections.add(a); 
     b.connections.add(c); 
     b.connections.add(d); 

     c.connections.add(b); 
     c.connections.add(d); 

     d.connections.add(b); 
     d.connections.add(c); 
     d.connections.add(e); 

     DFS.search(d); 
    } 
} 
Verwandte Themen