Я думаю, что необходимо описать настоящую проблему позади этого. Я говорю это, потому что Вы просите что-то у эффективного времени, все же набор ответа к проблеме, кажется, растет экспоненциально!
Поэтому я не ожидал бы лучший алгоритм, чем что-то экспоненциальное.
я сделал бы отслеживание в обратном порядке и прохождение через целого графика. Для предотвращения циклов сохраните все посещаемые узлы по пути. Когда Вы возвращаетесь, снимаете выделение с узла.
Используя рекурсию:
static bool[] visited;//all false
Stack<int> currentway; initialize empty
function findnodes(int nextnode)
{
if (nextnode==destnode)
{
print currentway
return;
}
visited[nextnode]=true;
Push nextnode to the end of currentway.
for each node n accesible from nextnode:
findnodes(n);
visited[nextnode]=false;
pop from currenteay
}
Или та несправедливость?
редактирование: О, и я забыл: необходимо устранить рекурсивные вызовы путем использования той стопки узла
Иногда Вы хотите возвратить другую информацию от ул. функция, но Хотеть показать некоторую другую информацию в выпадающем из администратора. Затем Вышеупомянутое решение не будет работать.
можно сделать это путем разделения на подклассы форм. ModelChoiceField как это.
class TestChoiceField(forms.ModelChoiceField):
def label_from_instance(self, obj):
return "Test: {}".format(obj.id)
можно затем переопределить formfield_for_foreignkey
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'test':
return TestChoiceField(queryset=Test.objects.all())
return super().formfield_for_foreignkey(db_field, request, **kwargs)