2016-12-11 7 views
2

Ich versuche, die Kanten in meinem Diagramm kleines Beispiel zu umkehren, von hier:die Kanten Umkehren in gerichtetem gewichteten Graphen

(1)---1--->(8) 
\  /
    2  1 
    \ /
    v v 
    (4) 

dazu:.

(1)<---1---(8) 
^  ^
    \  /
    2  1 
    \ /
     (4) 

Ich habe versucht:

private static void Transpose(EdgeWeightedDigraph G) { 

    for (int v = 0; v < G.V(); v++) { 
     // reverse so that adjacency list is in same order as original 
     Stack<DirectedEdge> reverse = new Stack<DirectedEdge>(); 
     for (DirectedEdge e : G.adj(v)) { 
      reverse.push(e); 
     } 
     for (DirectedEdge e : reverse) { 
      adj[v].add(e); 
     } 
    } 

} 

Ideen bitte?


Update 1:

 private static Bag<DirectedEdge>[] adj; // adj[v] = adjacency list for vertex v 

     adj = (Bag<DirectedEdge>[]) new Bag[G.V()]; 
    for (int v = 0; v < G.V(); v++) 
     adj[v] = new Bag<DirectedEdge>(); 

Der Ausgang für meinen Code ist der gleiche Graph, hat mein Code nicht die Kanten umkehren


Update 2: EdgeWeightedGraph


Update 3:

dies ist der richtige Link: EdgeWeightedDigraph

nicht die vorherige

dies nützlich sein wird, auch DirectedEdge

+0

Ich denke, dass es ein Problem mit der Zeile 'adj [v] .add (e) gibt;' Keine Ahnung, woher 'adj [v]' kommt. Bitte aktualisieren Sie den Code. – entpnerd

+0

Würde es Ihnen etwas ausmachen, die Implementierung für 'EdgeWeightedDigraph' hinzuzufügen? Kann sich diese Klasse ändern oder muss die Lösung außerhalb dieser Klasse liegen? – entpnerd

+0

Korrigiere ich, dass es nicht das Ziel ist, das ursprüngliche Diagramm zu ändern, sondern stattdessen ein neues Diagramm mit umgekehrten Kanten zu erstellen? Aufgrund des von Ihnen bereitgestellten Quellcodes und der Implementierung der Edge-Klasse habe ich Zweifel, dass eine In-Place-Lösung gefragt ist. – entpnerd

Antwort

1

Da dies eine Hausaufgaben Problem zu sein scheint (lassen Sie mich wissen, ob ich liege falsch, und du hast gesagt, was du bisher versucht hast und welche Schwierigkeit du hast, ich werde eine Lösung auf hohem Niveau geben und den Code dafür weglassen.

Grundsätzlich müssen Sie eine Liste der Kanten über die EdgeWeightedDirectedGraph.edges() Methode erhalten. Dann instanziieren Sie eine neue leere EdgeWeightedDirectedGraph für V neue Kanten. Da der Typ Edge unveränderlich ist, müssen Sie neue Kanten erstellen. Erstellen Sie also für jede Originalkante, die Sie aus dem ursprünglichen Diagramm abgerufen haben, eine neue Kante, die v und w umgekehrt hat, aber mit dem gleichen Gewicht. Fügen Sie dann diese neue umgekehrte Kante zu Ihrem neuen Diagramm hinzu. Nachdem Sie dem neuen Diagramm die neuen umgekehrten Kanten hinzugefügt haben, verfügen Sie jetzt über eine Kopie des ursprünglichen Diagramms, jedoch mit umgekehrten Kanten.

Beachten Sie, dass dieser Ansatz zum Erstellen eines neuen Diagramms am praktikabelsten ist, da der Code EdgeWeightedDirectedGraph scheinbar keine praktische Möglichkeit zum Entfernen von Kanten bietet, sondern nur zum Hinzufügen.

Bearbeiten: Hinzufügen von Beispielcode wie pro Anfrage.

public static void main(String[] args) { 
    EdgeWeightedDigraph g = new EdgeWeightedDigraph(3); 
    DirectedEdge e1 = new DirectedEdge(0, 1, 01.10); 
    g.addEdge(e1); 
    DirectedEdge e2 = new DirectedEdge(1, 2, 12.21); 
    g.addEdge(e2); 
    DirectedEdge e3 = new DirectedEdge(2, 0, 20.02); 
    g.addEdge(e3); 
    System.out.println(g.toString()); 

    EdgeWeightedDigraph gr = reverse(g); 
    System.out.println(gr.toString()); 
} 

private static EdgeWeightedDigraph reverse(EdgeWeightedDigraph g) { 
    int numVertices = g.V(); 
    EdgeWeightedDigraph gr = new EdgeWeightedDigraph(numVertices); 
    for (DirectedEdge e : g.edges()) { 
     int f = e.from(); 
     int t = e.to(); 
     double w = e.weight(); 
     DirectedEdge er = new DirectedEdge(t, f, w); 
     gr.addEdge(er); 
    } 
    return gr; 
} 
+0

Ich werde versuchen, dass –

+0

Cool.Kommentiere weiter, wenn du noch mehr Hilfe brauchst. – entpnerd

+0

Können Sie den Code bitte hinzufügen (auch wenn es hier und da kleine Fehler gibt)? Der Zweck dieser Hausaufgaben ist nicht zu lernen, wie man programmiert, es ist Algorithmen-Kurs. Hier ist es ein kleiner Teil des Algorithmus und ich möchte keine Zeit mit technischen Problemen verschwenden –

Verwandte Themen