我试图在我的图表小例子中反转边缘,从而:
(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 :(得分:1)
因为这似乎是一个家庭作业问题(让我知道我是否错了),并且你已经陈述了你迄今为止所尝试的内容以及你有什么困难。拥有,我将提供一个高级解决方案,并省略代码来做到这一点。
基本上,您必须通过EdgeWeightedDirectedGraph.edges()
方法获取边缘列表。然后,为EdgeWeightedDirectedGraph
个新边缘实例化一个新的空V
。由于Edge
类型是不可变的,因此您需要创建新边。因此,对于从原始图形中检索的每个原始边缘,实例化一个新的边缘,其v
和w
反转但具有相同的权重。然后,将新的反转边缘添加到新图形中。将新的反转边添加到新图形后,您现在可以获得原始图形的副本,但边缘相反。
请注意,这种创建新图表的方法是最可行的,因为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;
}