Python转Java翻译
我有一段很短的Python算法代码,但我需要把它翻译成Java。我没有找到任何可以做到这一点的程序,所以我非常感谢能有人帮我翻译一下。
我学过一点Python,主要是想了解算法是怎么工作的。
最大的问题在于,Python中的一切都是对象,有些东西让人感到非常困惑,比如
sum(self.flow[(source, vertex)] for vertex, capacity in self.get_edges(source))
而“self.adj”就像是一个可以存多个值的哈希表,我完全不知道该怎么把这些值放在一起。在Java中有没有更好的集合可以用来处理这段代码?
代码是:
class FlowNetwork(object):
def __init__(self):
self.adj, self.flow, = {},{}
def add_vertex(self, vertex):
self.adj[vertex] = []
def get_edges(self, v):
return self.adj[v]
def add_edge(self, u,v,w=0):
self.adj[u].append((v,w))
self.adj[v].append((u,0))
self.flow[(u,v)] = self.flow[(v,u)] = 0
def find_path(self, source, sink, path):
if source == sink:
return path
for vertex, capacity in self.get_edges(source):
residual = capacity - self.flow[(source,vertex)]
edge = (source,vertex,residual)
if residual > 0 and not edge in path:
result = self.find_path(vertex, sink, path + [edge])
if result != None:
return result
def max_flow(self, source, sink):
path = self.find_path(source, sink, [])
while path != None:
flow = min(r for u,v,r in path)
for u,v,_ in path:
self.flow[(u,v)] += flow
self.flow[(v,u)] -= flow
path = self.find_path(source, sink, [])
return sum(self.flow[(source, vertex)] for vertex, capacity in self.get_edges(source))
g = FlowNetwork()
map(g.add_vertex, ['s','o','p','q','r','t'])
g.add_edge('s','o',3)
g.add_edge('s','p',3)
g.add_edge('o','p',2)
g.add_edge('o','q',3)
g.add_edge('p','r',2)
g.add_edge('r','t',3)
g.add_edge('q','r',4)
g.add_edge('q','t',2)
print g.max_flow('s','t')
这个例子的结果是“5”。
这个算法的作用是找到从源点“s”到目标点“t”的图(链表或其他形式)中的最大流。
非常感谢任何建议。
1 个回答
2
Java没有像Python那样的简洁语法来处理列表。你需要用循环来遍历这个列表,并在遍历的过程中计算出sum
的值。
另外,self.flow
看起来像是一个用成对的值作为索引的字典。根据我所知道的,唯一能做到这一点的方法是创建一个包含两个字段的类,并实现hashCode
和equals
方法,这样才能用它作为HashMap的键。