Перевод с Python на Java - PullRequest
0 голосов
/ 13 мая 2010

Я получаю довольно короткий код алгоритма в Python, но мне нужно перевести его на Java. Я не нашел ни одной программы для этого, поэтому буду очень признателен за помощь в переводе.

Я очень мало изучил python, чтобы понять, как работает алгоритм.

Самая большая проблема в том, что в python все является объектом, а некоторые вещи сделаны действительно очень запутанными, как

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

и "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.

Большое спасибо за любую идею

1 Ответ

2 голосов
/ 13 мая 2010

У Java нет ничего похожего на синтаксис понимания Python. Вам придется заменить его кодом, который перебирает список и агрегирует значение sum, как оно есть.

Кроме того, self.flow выглядит как словарь, индексированный парами. Единственный способ сопоставить это, AFAIK, - создать класс с двумя полями, который реализует hashCode и equals для использования в качестве ключа для HashMap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...