Подтвердить что ты не робот

Обнаружение, когда возможно умножение матрицы

Вот интересная проблема, с которой я столкнулся в соревновании по программированию:

Заявление о проблемах: Учитывая размеры матриц n, определите, существует ли порядок, чтобы матрицы можно было умножить. Если он существует, распечатайте размер (произведение размеров) результирующей матрицы.

Мои наблюдения:. Это сводится к NP-полной гамильтоновой проблеме пути, если вы рассматриваете каждую матрицу как вершину и рисуете направленное ребро между матрицами, которые можно умножить. Я решил это просто грубо заставляя проблему, но это явно очень медленно. Мне было интересно, есть ли какая-нибудь умная оптимизация для этого конкретного экземпляра проблемы.

4b9b3361

Ответ 1

  • Создайте node для каждой длины измерения. То есть, если есть матрица размерности (m, n), то m и n будут вершинами в графе.

  • Для каждой матрицы размера (m, n) соединяйте узлы m и n с направленным ребром (между двумя узлами могут быть несколько ребер).

  • Теперь поиск эуларического следа даст порядок умножения.

См. http://en.wikipedia.org/wiki/Euler_path для поиска маршрутов Eularian. Сложность довольно близка к линейной (O (nlog ^ 3n loglogn), где n - количество ребер = число матриц).

Ответ 2

Создайте матрицу совместимости (пусть ее называют CM), например CM [x, y] = 1, если матрицу x можно умножить на y, 0, если нет. если Определитель (CM) &lt > 0 имеет порядок.

Это просто интуиция, я прошу прощения, если я ошибаюсь (к сожалению, я не смог найти убедительное доказательство).