在有向加权图中反转边

时间:2016-12-11 09:17:50

标签: java graph transpose

我试图在我的图表小例子中反转边缘,从而:

(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

1 个答案:

答案 0 :(得分:1)

因为这似乎是一个家庭作业问题(让我知道我是否错了),并且你已经陈述了你迄今为止所尝试的内容以及你有什么困难。拥有,我将提供一个高级解决方案,并省略代码来做到这一点。

基本上,您必须通过EdgeWeightedDirectedGraph.edges()方法获取边缘列表。然后,为EdgeWeightedDirectedGraph个新边缘实例化一个新的空V。由于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;
}