Теория
- Метод Гаусса
- Приведение матрицы A к виду EA'. Не переставляя в явном виде столбцы. Массив p[0..m-1]
- Основная операция Do(i,j) - поставить на позицию (i,j) единицу, а весь остаток j-го столбца обнулить.
- x = (b,0)
- Аффинное пространство решений.
- Добавление нового уравнения в систему за O(N2).
- Линейное программирование
- Канонический вид: Ax = b, x >= 0
- Приведение к каноническому виду (1) Ax < b => Ax + z = b (2) x = u - v, u >= 0, v >= 0
- Док-во того, что если есть M линейно независимых уравненией, то в оптимальном решении N-M переменных точно равны 0.
- Решение за O(C(N,M)*N3) = перебор всех базисных планов
- Simplex метод
- Приведение матрицы A к виду EA' (а заодно делаем так, что строки линейнонезависимы)
- Поиск начального решения, если b < 0 = Simplex метод
- Переход к новому плану: увеличиваем x[j], целевая функция улучшается: dc[j] = c[j] - Sum(a[i][j] * c[p[i]]) > 0.
- Если увеличивать можно бесконечно, max = infinity, иначе какое-то x[p[i]] уменьшится до нуля.
- Какое i уменьшится до нуля? min из b[i] / a[i][j] по a[i][j] > 0.
- Далее Do(i, j). И не забыть поменять массив p[].
- Быстрый Simplex метод
- dc[j] = c[j] - Sum(a[i][j] * c[p[i]]), можно пересчитывать одновременно с матрицей A. Теперь пару (i,j) можно найти за O(N+M).
- В Do(i, j) сперва за O(M) выбрали все K ненулевых элементов в строке. За O(KL) сделали изменение матрицы, где L число a[l,j] != 0.
- Решение задач с помощью Simplex-а
- Min = Max.
- Если нет условия 0 <= x, его можно не добавлять.
- Если есть условие 0 <= x <= c, то это на самом деле одно условие.
- Flow - матрица получает (V-2) x E.
- MinCostFlow - добавляем еще одно уравнение, что поток равен K, минимизируем вес.
- Задачка с чемпионата Урала timus : 1833
- Триатлон timus : 1062
Практика
- 110304a1 : 6A (поток обыкновенный)
- 110304a1 : 6B (mincost поток - задача о назначениях)
- timus : 1764 (маленькая задача ЛП)
- timus : 1833 (задача с последнего чемпионата Урала)
- timus : 1062 (еще одна задача ЛП)