2017-02-02 2 views
0

У меня много объектов. Некоторые объекты могут создавать список цепочек, и все объекты имеют продолжение цепочки при условии. Пример будет объяснять больше. Скажем, у меня есть эти два объекта:Найдите самый длинный список цепочек?

[ 
    { 
    "name": "ObjectA", 
    "produce": "ChainA", 
    "continuations": [ 
     { "ChainB": "ChainC" }, 
     { "ChainC": "ChainC" } 
    ] 
    } 
    { 
    "name": "ObjectB", 
    "produce": null, 
    "continuations": [ 
     { "ChainA": "ChainB" } 
    ] 
    } 
] 

Мне нужно найти список:

ChainA (ObjectA) => ChainB (ObjectB) => ChainC (ObjectA) => ChainC (ObjectA) 

Я просто не могу найти лучший способ, что зацикливание снова и снова. У некоторых из вас есть идея?

Благодаря

+0

Ваш пример усложнил его. Какая цепь С, какая цепь Б. Кроме того, что вы пробовали? – smttsp

ответ

0

Эта проблема является NP-полной, потому что если вы имели эффективный алгоритм ее решения, то вы могли бы решить https://en.wikipedia.org/wiki/Longest_path_problem. Так что это довольно безнадежно.

Вот это сокращение. Учитывая ориентированный граф G, помечайте края как объекты и назовите вершины как цепочки. Каждый «объект» (край) создает «цепочку», к которой относится вершина. Каждый «объект» (край) имеет единственное продолжение от исходной «цепочки» (вершины) до целевой «цепи» (вершины).

Теперь примените гипотетический алгоритм. Самый длинный список цепочек будет краем желаемого самого длинного пути для G.

Смежные вопросы