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

이 (나를 알고하자이 도움이 될 것입니다 I 당신이 지금까지 해봤 던 것과 무슨 어려움을 겪었는지, 높은 수준의 해결책을 제시하고, 코드를 생략 할 것이라고 언급했습니다.

기본적으로 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

코드를 추가 할 수 있습니까? (여기저기서 작은 실수가 있더라도)? 이 숙제의 목적은 프로그램하는 법을 배우는 것이 아니라 알고리즘 과정입니다. 여기 알고리즘의 작은 부분이고 기술적 인 문제에 시간을 낭비하고 싶지 않다. –

관련 문제