2010-05-13 94 views
0

我在python中得到了很短的算法代碼,但是我需要將它翻譯成Java。我沒有找到任何程序來做到這一點,所以我會很感激幫助翻譯它。Python到Java翻譯

我學會了python,知道算法是如何工作的。

最大的問題是,因爲所有的Python是對象,有些事情是由很喜歡

sum(self.flow[(source, vertex)] for vertex, capacity in self.get_edges(source)) 

,非常confuzing「self.adj」就像是與我不知道如何把多個值的HashMap全部一起。在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」查找圖中的最大流量(鏈表或其他)。

非常感謝任何想法

+2

這功課嗎? – 2010-05-13 11:03:37

+0

總是有jython(http://www.jython.org)來創建一個.class文件。 (如果真的有必要http://www.google.com/search?q=java+decompiler反編譯成.java文件。) – mawimawi 2010-05-13 19:37:21

回答

2

Java沒有像Python的理解語法。您必須將其替換爲在列表中循環的代碼,並彙總sum的值。

此外,self.flow看起來像一個字典索引成對。與AFAIK匹配的唯一方法是創建一個包含兩個字段的類,這兩個字段分別實現了hashCodeequals作爲HashMap的關鍵字。

+0

[Michael Aaron Safyan]:是的,它是作業,但不是Python的翻譯。這是關於最大流量問題。 http://en.wikipedia.org/wiki/Maximum_flow_problem 我想要這個算法的唯一原因是因爲它非常短。但是經過漫長的夜晚,我學習了一下python並手工翻譯了它。但之後,我意識到它需要很多開銷,所以對於更大的圖表來說它並不是非常有用。 現在我實際上正在尋找更好的實現,所以如果任何人知道更多的這個問題,我會欣賞任何額外的想法。 謝謝你的任何方式。 – user340179 2010-05-13 20:20:36