2016-12-11 4 views
2

有向重み付きグラフのエッジを、反転:これにこのことから、私は私のグラフ小さな例では、エッジを逆にしようとしています

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

:。

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

は、私が試した:

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); 
     } 
    } 

} 

任意のアイデアをしてください?


アップデート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>(); 

私のコードの出力は同じグラフで、私のコードは、エッジ


アップデート2を反転しない。 EdgeWeightedGraph


アップデート3:

これは、右のリンクです:EdgeWeightedDigraph

ない以前

これは宿題の問題のように見えるので、これは(もDirectedEdge

+0

私は 'adj [v] .add(e);行に問題があると思います。' adj [v] 'がどこから来ているのか分かりません。コードを更新してください。 – entpnerd

+0

'EdgeWeightedDigraph'の実装を追加してもよろしいですか?また、そのクラスを変更することができますか、ソリューションはそのクラスの外になければなりませんか? – entpnerd

+0

元のグラフを変更するのではなく、エッジを逆にして新しいグラフを作成するのが目的だと推測しますか?あなたが提供したソースコードと 'Edge'クラスの実装に基づいて、インプレースの解決策が尋ねられました。 – entpnerd

答えて

1

有用であろう私なら、私に知らせてそれについては間違っています)、これまでに試したことや難しかったことを述べましたが、私は高水準のソリューションを提供し、それを行うコードは除外します。

基本的には、EdgeWeightedDirectedGraph.edges()メソッドを使用してエッジのリストを取得する必要があります。次に、V新しいエッジの新しい空のEdgeWeightedDirectedGraphをインスタンス化します。 Edgeタイプは不変なので、新しいエッジを作成する必要があります。元のグラフから取得した元の各エッジに対して、vwが反転して同じウェイトの新しいエッジをインスタンス化します。次に、新しい反転したエッジを新しいグラフに追加します。新しい反転した辺を新しいグラフに追加した後、元のグラフのコピーがありますが、辺が反転しています。

EdgeWeightedDirectedGraphコードではエッジを削除する便利な方法がないため、新しいグラフを作成するこの方法が最も実現可能であることに注意してください。

編集:リクエストごとにサンプルコードを追加します。

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

私はそれを試してみます –

+0

クール。それでもなお助けが必要な場合は、さらにコメントしてください。 – entpnerd

+0

コードを追加することはできますか(たとえそこに小さな間違いがあっても)?この宿題の目的は、プログラミング方法を学ぶことではなく、アルゴリズムコースです。ここではアルゴリズムのほんの一部ですが、技術的な問題に時間を費やしたくありません –

関連する問題