Python3/NetworkX Граф. Как найти правильный путь в графе, содержащий заданные вершины?

Задача такая:

Задан граф, ориентированный, с циклами:

g = nx.MultiDiGraph()
g.add_nodes_from(["<FrFric>","<OpFric>","<OpPull>",'<Spd2>','<Spd1>','<Dist>','<Time>','<Accl>','<Mass>','<FrPull>','<KinEn2>','<KinEn1>','<CfFric>'])
g.add_edges_from([ ("<FrFric>",'<FrPull>'), ("<FrFric>",'<Mass>'), ("<FrFric>",'<Accl>'), ("<FrFric>",'<Cfg>'), ("<FrFric>",'<Mass>'), ("<FrFric>",'<CfFric>'), ("<FrFric>",'<OpFric>'), ("<FrFric>",'<Dist>'),  ("<OpFric>",'<FrFric>'), ("<OpFric>",'<Dist>'), ("<OpFric>",'<OpPull>'), ("<OpFric>",'<KinEn2>'),("<OpFric>",'<KinEn1>'),  ("<OpPull>",'<FrPull>'), ("<OpPull>",'<Dist>'), ("<OpPull>",'<KinEn2>'),("<OpPull>",'<KinEn1>'), ("<OpPull>",'<OpFric>'),  ('<Spd2>','<Spd1>'),('<Spd2>','<Accl>'),('<Spd2>','<Time>'),('<Spd2>','<Dist>'),('<Spd2>','<Spd1>'),('<Spd2>','<KinEn2>'),('<Spd2>','<Mass>'),  ('<Spd1>','<Spd2>'),('<Spd1>','<Accl>'),('<Spd1>','<Time>'),('<Spd1>','<Dist>'),('<Spd1>','<Time>'),('<Spd1>','<Accl>'),('<Spd1>','<Spd2>'),('<Spd1>','<Accl>'),('<Spd1>','<Dist>'),('<Spd1>','<KinEn1>'),('<Spd1>','<Mass>'),  ('<Dist>','<Spd1>'),('<Dist>','<Time>'),('<Dist>','<Accl>'),('<Dist>','<Time>'),('<Dist>','<Spd2>'),('<Dist>','<Spd1>'),('<Dist>','<Accl>'),('<Dist>','<OpPull>'),('<Dist>','<FrPull>'),('<Dist>','<OpFric>'),('<Dist>','<FrFric>'),  ('<Time>','<Spd2>'),('<Time>','<Spd1>'),('<Time>','<Accl>'),('<Time>','<Spd1>'),('<Time>','<Accl>'),('<Time>','<Dist>'),  ('<Accl>','<Spd2>'),('<Accl>','<Spd1>'),('<Accl>','<Time>'),('<Accl>','<Dist>'  ),('<Accl>','<Spd1>'),('<Accl>','<Time>'),('<Accl>','<Spd2>'),('<Accl>','<Spd1>'),('<Accl>','<Dist>'),('<Accl>','<FrPull>'),('<Accl>','<FrFric>'),('<Accl>', '<Mass>'),  ('<Mass>','<FrPull>'),('<Mass>',  '<FrFric>'),('<Mass>',  '<Accl>'),('<Mass>', '<KinEn2>'),('<Mass>',  '<Spd2>'),('<Mass>', '<KinEn1>' ),('<Mass>', '<Spd1>'),('<Mass>','<FrFric>'),('<Mass>',  '<Cfg>'),('<Mass>','<CfFric>'),  ('<FrPull>','<FrFric>'),('<FrPull>',  '<Mass>'),('<FrPull>',  '<Accl>'),('<FrPull>', '<OpPull>'),('<FrPull>',  '<Dist>'),  ('<KinEn2>','<Mass>'),('<KinEn2>',  '<Spd2>'),('<KinEn2>', '<OpPull>'),('<KinEn2>',  '<OpFric>'),('<KinEn2>',  '<KinEn1>'),  ('<KinEn1>','<Mass>'),('<KinEn1>',  '<Spd1>'),('<KinEn1>', '<KinEn2>'),('<KinEn1>',  '<OpPull>'),('<KinEn1>',  '<OpFric>'),  ('<CfFric>','<FrFric>'),('<CfFric>', '<Mass>'),('<CfFric>',  '<Cfg>') ])

Известна начальная стартовая вершина::

FrFric

Также известны несколько вершин которые содержатся (встречаются) в пути::

{ Dist, KinEn1, KinEn2, FrPull }

Необходимо как-то обойти и перебрать за наименьшее время O(n^2) O(n) O(logn) и вывести правильный путь! т.е. надо еще, найти связанные вершины из которых выходят известные вершины и построить как бы всю полную цепочку вывода пути!

Для вершины FrFric должна получиться такая цепочка пути::

FrFric => OpFric => OpPull

т.е. начиная с FrFric начинаем обход.. встречаем Dist из множества известных вершин.. далее OpFric - а из неё KinEn1, KinEn2 известные и OpPull.. смотрим OpPull а из неё входят FrPull и Dist известные! и ответ получен!

т.е. прошли путь - нашли там какие-то неизвестные вершины, которые связаны с известными и.. Если весь путь развернуть, ответ получается вот такой:

FrFric = (((FrPull, Dist), KinEn2, KinEn1), Dist)

И вот, как написать такой эффективный алгоритм вывода?? на Python3!

Какие есть варианты??


Ответы (0 шт):