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!
Какие есть варианты??