Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 3, 2015 10:28:16

Andrew22528
Зарегистрирован: 2015-05-17
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск цикла в графе

Есть ориентированный граф. На вход подается 2 числа N и M - количества вершин и рёбер в графе соответственно. Далее в M строках перечислены рёбра графа. Каждое ребро задаётся парой чисел — номерами начальной и конечной вершин. Надо вывести ‘YES’ и номера вершин в цикле, если цикл есть. Иначе вывести ‘NO’. Заранее спасибо

Офлайн

#2 Авг. 5, 2015 12:08:45

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Поиск цикла в графе

Взято из библиотеки bytenet3

import collections, itertools
def get_loops(MN):
    """ Returns the tuple of closed loops. Loops are represented as ordered lists of nodes """
    network = {}
    for a,b in MN:
        network[a].add(b) if a in network else network.update({a:{b}})
        network[b].add(a) if b in network else network.update({b:{a}})
    chain = collections.OrderedDict()
    def __loop_iterator(node):
        if node not in chain:
            chain[node] = None
            next = network[node]
            while next:
                n = next.pop()
                network[n].remove(node)
                yield from __loop_iterator(n)
            chain.popitem()
        else: yield tuple(itertools.chain(itertools.takewhile(lambda x: x is not node, reversed(chain)), (node,)))
    # 'for' is needed for just to run from any first available node as n
    for n in network: return tuple(__loop_iterator(n))
    
ch = [(1,4), (4,3), (3,2), (6,3), (4,6), (5,6), (5,4)]
>>> print( *get_loops(ch), sep = '\n' )
(6, 3, 4)
(5, 6, 3, 4)



Отредактировано Isem (Авг. 5, 2015 12:11:35)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version