2016-12-11 42 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

你可以添加代碼嗎(即使這裏和那裏有小錯誤)?這個作業的目的不是學習如何編程,而是算法課程。這是算法的一小部分,我不想在技術問題上耗費時間 –