Я пытаюсь найти ширину направленного ациклического графа ... как представлено произвольно упорядоченным списком узлов, даже без список смежности.Поиск ширины направленного ациклического графа ... только с возможностью поиска родителей
График/список предназначен для параллельного диспетчера рабочего процесса GNU Make-like, который использует файлы в качестве критериев для порядка выполнения. Каждый узел имеет список исходных файлов и целевых файлов. У нас есть хеш-таблица на месте, так что, учитывая имя файла, можно определить узел, который его производит. Таким образом, мы можем выяснить родителей узла, исследуя узлы, которые генерируют каждый из его исходных файлов, используя эту таблицу.
Это единственная способность, которую я имею на данный момент, без серьезного изменения кода. Код был в общественном использовании некоторое время, и последнее, что мы хотим сделать, это значительно изменить структуру и иметь плохую версию. И нет, у нас нет времени на тщательное тестирование (я в академической среде). В идеале мы надеемся, что сможем сделать это, не делая ничего более опасного, чем добавлять поля к узлу.
Я отправлю ответ сообщества-вики, изложив мой нынешний подход и его недостатки. Если кто-то хочет отредактировать это или использовать его в качестве отправной точки, не стесняйтесь. Если я могу что-то сделать, чтобы прояснить ситуацию, я могу ответить на вопросы или отправить код, если это необходимо.
Спасибо!
EDIT: Для тех, кто интересуется, это будет в C. Да, я знаю, что мой псевдокод находится в некотором ужасно неудачном Python. Я как бы надеюсь, что язык не имеет значения.
Хм ... Мне удалось реализовать свой алгоритм, и он сработал. Я не уверен, что ширина - это то, что я действительно хочу, но это то, что мне сказали, что я должен использовать. Я соглашусь с этим ответом, потому что это заставило меня подумать больше всего о том, и, если это произойдет, я буду помнить об этом. (Однако стоит подумать: трудно найти самый длинный путь в DAG, потому что некоторые задачи занимают больше времени, чем другие, чтобы выполнить. Таким образом, это решение, по-видимому, по меньшей мере настолько же ошибочно, как и мое.) –
Самый длинный путь в DAG с весами узлов (или веса краев) легко, используйте алгоритм Дейкстры или просто топологическую сортировку, и один проход, как предполагает Ил-Бхима. –