Нахождение «обобщенной диагонали» в двоичной матрице - PullRequest
2 голосов
/ 05 февраля 2011

«Обобщенная диагональ» в матрице NXN - это выборка из N ячеек, такая что:

  1. Ровно одна ячейка выбрана из каждой строки и каждого столбца
  2. Каждая выделенная ячейка содержит ненулевое значение

Я ищу алгоритм для поиска обобщенной диагонали в O (n ^ 3). Мне кажется, что следующий алгоритм динамического программирования «достаточно хорош», но я не уверен, как проанализировать его сложность.

Set<Set<Integer>> failedCache = new HashSet<Set<Integer>>();

List<Integer> find(int[][] matrix, Set<Integer> used, int row) {
    int N = matrix.length;
    if (failedCache.contains(used))
        return null;

    if (row == N) return new ArrayList<Integer>();

    for (int col = 0; col < N; ++col) {
        if (matrix[row][col] == 0)
            continue;

        if (used.contains(col))
            continue;

        Set<Integer> newUsed = new HashSet<Integer>(used);
        newUsed.add(col);
        List<Integer> answer = find(matrix, newUsed, row + 1);
        if (answer != null) {
            answer.add(col);
            return answer;
        }
    }

    failedCache.add(used);
    return null;
}

1 Ответ

3 голосов
/ 05 февраля 2011

Алгоритм работает в наихудшем экспоненциальном времени, потому что по следующей матрице

 11111
 11111
 11111
 11111
 00000

попробуем про это! возможные комбинации.

Для решения за полиномиальное время создайте двудольный граф, используя матрицу, и найдите идеальное соответствие .

Например, с матрицей

 011
 101
 001

вы создаете график

 A    X
 B    Y
 C    Z

с ребрами A-> Y, A-> Z, B-> X, B-> Z, C-> Z.

...