77
с/к “Эффективные алгоритмы” Лекция 5: Задача полуопределённого программирования А. Куликов Computer Science клуб при ПОМИ http://logic.pdmi.ras.ru/infclub/ А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 1 / 25

Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Embed Size (px)

Citation preview

Page 1: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

с/к “Эффективные алгоритмы”Лекция 5: Задача полуопределённого

программирования

А. Куликов

Computer Science клуб при ПОМИhttp://logic.pdmi.ras.ru/∼infclub/

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 1 / 25

Page 2: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

План лекции

1 Задача полуопределённого программирования

2 Задача о максимальном разрезе

3 Задача о раскраске графа

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 2 / 25

Page 3: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

План лекции

1 Задача полуопределённого программирования

2 Задача о максимальном разрезе

3 Задача о раскраске графа

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 2 / 25

Page 4: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

План лекции

1 Задача полуопределённого программирования

2 Задача о максимальном разрезе

3 Задача о раскраске графа

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 2 / 25

Page 5: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

План лекции

1 Задача полуопределённого программирования

2 Задача о максимальном разрезе

3 Задача о раскраске графа

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 3 / 25

Page 6: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Положительно полуопределенные матрицыОпределениеСимметрическая матрица называется положительно полуопределённой(positive semidefinite), если все её собственные числа неотрицательны.Обозначение: A ⪰ 0.

ФактПусть A ∈ Rn×n — симметрическая матрица. Следующие условияэквивалентны:

A ⪰ 0;квадратичная форма xTAx неотрицательна для любого x ∈ Rn;существуют вектора u1, . . . , un ∈ Rm, такие что aij = uT

i uj ; или жеA = UTU для некоторой U;A является неотрицательной линейной комбинацией матриц типаxxT ;определитель любого симметрического минора A неотрицателен.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 4 / 25

Page 7: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Положительно полуопределенные матрицыОпределениеСимметрическая матрица называется положительно полуопределённой(positive semidefinite), если все её собственные числа неотрицательны.Обозначение: A ⪰ 0.

ФактПусть A ∈ Rn×n — симметрическая матрица. Следующие условияэквивалентны:

A ⪰ 0;квадратичная форма xTAx неотрицательна для любого x ∈ Rn;существуют вектора u1, . . . , un ∈ Rm, такие что aij = uT

i uj ; или жеA = UTU для некоторой U;A является неотрицательной линейной комбинацией матриц типаxxT ;определитель любого симметрического минора A неотрицателен.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 4 / 25

Page 8: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Положительно полуопределенные матрицыОпределениеСимметрическая матрица называется положительно полуопределённой(positive semidefinite), если все её собственные числа неотрицательны.Обозначение: A ⪰ 0.

ФактПусть A ∈ Rn×n — симметрическая матрица. Следующие условияэквивалентны:

A ⪰ 0;

квадратичная форма xTAx неотрицательна для любого x ∈ Rn;существуют вектора u1, . . . , un ∈ Rm, такие что aij = uT

i uj ; или жеA = UTU для некоторой U;A является неотрицательной линейной комбинацией матриц типаxxT ;определитель любого симметрического минора A неотрицателен.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 4 / 25

Page 9: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Положительно полуопределенные матрицыОпределениеСимметрическая матрица называется положительно полуопределённой(positive semidefinite), если все её собственные числа неотрицательны.Обозначение: A ⪰ 0.

ФактПусть A ∈ Rn×n — симметрическая матрица. Следующие условияэквивалентны:

A ⪰ 0;квадратичная форма xTAx неотрицательна для любого x ∈ Rn;

существуют вектора u1, . . . , un ∈ Rm, такие что aij = uTi uj ; или же

A = UTU для некоторой U;A является неотрицательной линейной комбинацией матриц типаxxT ;определитель любого симметрического минора A неотрицателен.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 4 / 25

Page 10: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Положительно полуопределенные матрицыОпределениеСимметрическая матрица называется положительно полуопределённой(positive semidefinite), если все её собственные числа неотрицательны.Обозначение: A ⪰ 0.

ФактПусть A ∈ Rn×n — симметрическая матрица. Следующие условияэквивалентны:

A ⪰ 0;квадратичная форма xTAx неотрицательна для любого x ∈ Rn;существуют вектора u1, . . . , un ∈ Rm, такие что aij = uT

i uj ; или жеA = UTU для некоторой U;

A является неотрицательной линейной комбинацией матриц типаxxT ;определитель любого симметрического минора A неотрицателен.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 4 / 25

Page 11: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Положительно полуопределенные матрицыОпределениеСимметрическая матрица называется положительно полуопределённой(positive semidefinite), если все её собственные числа неотрицательны.Обозначение: A ⪰ 0.

ФактПусть A ∈ Rn×n — симметрическая матрица. Следующие условияэквивалентны:

A ⪰ 0;квадратичная форма xTAx неотрицательна для любого x ∈ Rn;существуют вектора u1, . . . , un ∈ Rm, такие что aij = uT

i uj ; или жеA = UTU для некоторой U;A является неотрицательной линейной комбинацией матриц типаxxT ;

определитель любого симметрического минора A неотрицателен.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 4 / 25

Page 12: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Положительно полуопределенные матрицыОпределениеСимметрическая матрица называется положительно полуопределённой(positive semidefinite), если все её собственные числа неотрицательны.Обозначение: A ⪰ 0.

ФактПусть A ∈ Rn×n — симметрическая матрица. Следующие условияэквивалентны:

A ⪰ 0;квадратичная форма xTAx неотрицательна для любого x ∈ Rn;существуют вектора u1, . . . , un ∈ Rm, такие что aij = uT

i uj ; или жеA = UTU для некоторой U;A является неотрицательной линейной комбинацией матриц типаxxT ;определитель любого симметрического минора A неотрицателен.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 4 / 25

Page 13: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Общий вид задачи полуопределённогопрограммирования

Общий вид задачи полуопределённого программирования

минимизировать cT xпри условии x1A1 + · · ·+ xnAn − B ⪰ 0

где A1, . . . , An, B симметрические матрицы размера m ×m, c ∈ Rn.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 5 / 25

Page 14: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Сходства с задачей линейного программирования

Замечания

Если матрицы A1, . . . , An, B являются диагональными, тополучаем задачу линейного программирования.Поэтому задачу полуопределенного программирования можнорассматривать как обобщение задачи линейногопрограммирования.Есть, однако, и отличия.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 6 / 25

Page 15: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Сходства с задачей линейного программирования

ЗамечанияЕсли матрицы A1, . . . , An, B являются диагональными, тополучаем задачу линейного программирования.

Поэтому задачу полуопределенного программирования можнорассматривать как обобщение задачи линейногопрограммирования.Есть, однако, и отличия.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 6 / 25

Page 16: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Сходства с задачей линейного программирования

ЗамечанияЕсли матрицы A1, . . . , An, B являются диагональными, тополучаем задачу линейного программирования.Поэтому задачу полуопределенного программирования можнорассматривать как обобщение задачи линейногопрограммирования.

Есть, однако, и отличия.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 6 / 25

Page 17: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Сходства с задачей линейного программирования

ЗамечанияЕсли матрицы A1, . . . , An, B являются диагональными, тополучаем задачу линейного программирования.Поэтому задачу полуопределенного программирования можнорассматривать как обобщение задачи линейногопрограммирования.Есть, однако, и отличия.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 6 / 25

Page 18: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Пример

Пример

минимизировать x1 при условии

(︃x1 11 x2

)︃⪰ 0

ЗамечанияУсловие положительной полуопределенности сводится к выполнениюусловий x1, x2 ≥ 0 и x1x2 ≥ 1. Супремум 0, таким образом, недостигается.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 7 / 25

Page 19: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Пример

Пример

минимизировать x1 при условии

(︃x1 11 x2

)︃⪰ 0

ЗамечанияУсловие положительной полуопределенности сводится к выполнениюусловий x1, x2 ≥ 0 и x1x2 ≥ 1. Супремум 0, таким образом, недостигается.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 7 / 25

Page 20: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Факт

ФактСуществует алгоритм, находящий для данной задачиполуопределённого программирования решение с аддитивной ошибкой𝜖 за время, полиномиальное от размера входных данных и от log 1

𝜖 .

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 8 / 25

Page 21: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

План лекции

1 Задача полуопределённого программирования

2 Задача о максимальном разрезе

3 Задача о раскраске графа

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 9 / 25

Page 22: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Задача о максимальном разрезе

ОпределениеЗадача о максимальном разрезе (maximum cut problem, MAX-CUT)заключается в нахождении по данному взвешенномунеориентированному графу такого разбиения вершин на две части(раскраски в белый и чёрный цвета), при котором общий вес рёбер,соединяющих вершины разных частей, был бы максимален.

ФактИзвестно, что нахождение приближения, лучшего чем 16/17 ≈ 0.94,является NP-трудной задачей.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 10 / 25

Page 23: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Задача о максимальном разрезе

ОпределениеЗадача о максимальном разрезе (maximum cut problem, MAX-CUT)заключается в нахождении по данному взвешенномунеориентированному графу такого разбиения вершин на две части(раскраски в белый и чёрный цвета), при котором общий вес рёбер,соединяющих вершины разных частей, был бы максимален.

ФактИзвестно, что нахождение приближения, лучшего чем 16/17 ≈ 0.94,является NP-трудной задачей.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 10 / 25

Page 24: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Формулировка в виде задачи целочисленного линейногопрограммированияФормулировка в виде задачи целочисленного линейногопрограммирования

Сопоставим каждой вершине vi ∈ V число yi , где

yi =

{︃−1, vi — белая вершина,1, vi — чёрная вершина.

Тогда ребро (vi , vj) принадлежит разрезу тогда и только тогда,когда yiyj = −1.Величина же разреза вычисляется как

f (M) =∑︁i<j

1− yiyj

2wij .

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 11 / 25

Page 25: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Формулировка в виде задачи целочисленного линейногопрограммированияФормулировка в виде задачи целочисленного линейногопрограммирования

Сопоставим каждой вершине vi ∈ V число yi , где

yi =

{︃−1, vi — белая вершина,1, vi — чёрная вершина.

Тогда ребро (vi , vj) принадлежит разрезу тогда и только тогда,когда yiyj = −1.Величина же разреза вычисляется как

f (M) =∑︁i<j

1− yiyj

2wij .

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 11 / 25

Page 26: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Формулировка в виде задачи целочисленного линейногопрограммированияФормулировка в виде задачи целочисленного линейногопрограммирования

Сопоставим каждой вершине vi ∈ V число yi , где

yi =

{︃−1, vi — белая вершина,1, vi — чёрная вершина.

Тогда ребро (vi , vj) принадлежит разрезу тогда и только тогда,когда yiyj = −1.

Величина же разреза вычисляется как

f (M) =∑︁i<j

1− yiyj

2wij .

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 11 / 25

Page 27: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Формулировка в виде задачи целочисленного линейногопрограммированияФормулировка в виде задачи целочисленного линейногопрограммирования

Сопоставим каждой вершине vi ∈ V число yi , где

yi =

{︃−1, vi — белая вершина,1, vi — чёрная вершина.

Тогда ребро (vi , vj) принадлежит разрезу тогда и только тогда,когда yiyj = −1.Величина же разреза вычисляется как

f (M) =∑︁i<j

1− yiyj

2wij .

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 11 / 25

Page 28: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Релаксация: оптимизация на сфере большейразмерности

Релаксация: оптимизация на сфере большей размерности

Будем искатьmax

v1,...,vn∈Sng((v1, . . . , vn)),

где

g((v1, . . . , vn)) =∑︁i<j

1− vTi vj

2wij ,

а Sn — n-мерная единичная сфера.Ясно, что максимальное значение является верхней оценкой навеличину максимального разреза.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 12 / 25

Page 29: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Релаксация: оптимизация на сфере большейразмерности

Релаксация: оптимизация на сфере большей размерностиБудем искать

maxv1,...,vn∈Sn

g((v1, . . . , vn)),

где

g((v1, . . . , vn)) =∑︁i<j

1− vTi vj

2wij ,

а Sn — n-мерная единичная сфера.

Ясно, что максимальное значение является верхней оценкой навеличину максимального разреза.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 12 / 25

Page 30: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Релаксация: оптимизация на сфере большейразмерности

Релаксация: оптимизация на сфере большей размерностиБудем искать

maxv1,...,vn∈Sn

g((v1, . . . , vn)),

где

g((v1, . . . , vn)) =∑︁i<j

1− vTi vj

2wij ,

а Sn — n-мерная единичная сфера.Ясно, что максимальное значение является верхней оценкой навеличину максимального разреза.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 12 / 25

Page 31: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Вероятностное округление

Вероятностное округление

Рассмотрим решение (vi )i новой задачи.Проведем через начало координат случайным образомгиперплоскость T размерности n − 1, которая разделитпространство на два полупространства A и B . После чегоопределим yi так:

yi =

{︃1, vi ∈ A,

−1, vi ∈ B.

Иначе говоря, выберем случайным образом вектор u ∈ Sn ипостроим yi так:

yi =

{︃1, uT vi ≥ 0,−1, uT vi < 0.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 13 / 25

Page 32: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Вероятностное округление

Вероятностное округлениеРассмотрим решение (vi )i новой задачи.

Проведем через начало координат случайным образомгиперплоскость T размерности n − 1, которая разделитпространство на два полупространства A и B . После чегоопределим yi так:

yi =

{︃1, vi ∈ A,

−1, vi ∈ B.

Иначе говоря, выберем случайным образом вектор u ∈ Sn ипостроим yi так:

yi =

{︃1, uT vi ≥ 0,−1, uT vi < 0.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 13 / 25

Page 33: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Вероятностное округление

Вероятностное округлениеРассмотрим решение (vi )i новой задачи.Проведем через начало координат случайным образомгиперплоскость T размерности n − 1, которая разделитпространство на два полупространства A и B . После чегоопределим yi так:

yi =

{︃1, vi ∈ A,

−1, vi ∈ B.

Иначе говоря, выберем случайным образом вектор u ∈ Sn ипостроим yi так:

yi =

{︃1, uT vi ≥ 0,−1, uT vi < 0.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 13 / 25

Page 34: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Вероятностное округление

Вероятностное округлениеРассмотрим решение (vi )i новой задачи.Проведем через начало координат случайным образомгиперплоскость T размерности n − 1, которая разделитпространство на два полупространства A и B . После чегоопределим yi так:

yi =

{︃1, vi ∈ A,

−1, vi ∈ B.

Иначе говоря, выберем случайным образом вектор u ∈ Sn ипостроим yi так:

yi =

{︃1, uT vi ≥ 0,−1, uT vi < 0.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 13 / 25

Page 35: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Оценка оптимальности

ЛеммаПусть (vi )i — (приближённое) решение задачи, R ′ — значение g наэтом наборе. Пусть также (yi )i — набор, полученный с помощьюалгоритма, описанного выше, из (vi )i и U ′ = f ((yi )i ). Тогда

E [U ′] ≥ 0.87R ′.

ДоказательствоНеобходимо доказать, что

E∑︁i<j

1− yiyj

2wij ≥ 0.87

∑︁i<j

1− vTi vj

2wij .

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 14 / 25

Page 36: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Оценка оптимальности

ЛеммаПусть (vi )i — (приближённое) решение задачи, R ′ — значение g наэтом наборе. Пусть также (yi )i — набор, полученный с помощьюалгоритма, описанного выше, из (vi )i и U ′ = f ((yi )i ). Тогда

E [U ′] ≥ 0.87R ′.

ДоказательствоНеобходимо доказать, что

E∑︁i<j

1− yiyj

2wij ≥ 0.87

∑︁i<j

1− vTi vj

2wij .

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 14 / 25

Page 37: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Доказательство (продолжение)

Доказательство

Заметим, что yiyj = −1 тогда и только тогда, когда vi и vj лежат вразных полупространствах относительно нашей гиперплоскости T .

P(yi ̸= yj) =𝜃ij𝜋 , где 𝜃ij — угол между векторами vi и vj .

E∑︁i<j

1− yiyj

2wij =

∑︁i<j

𝜃ij

𝜋wij .

∑︁i<j

1− vTi vj

2wij =

∑︁i<j

1− cos 𝜃ij

2wij .

Осталось заметить, что min𝜃2𝜋

𝜃1−cos 𝜃 ≈ 0.87.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 15 / 25

Page 38: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Доказательство (продолжение)

ДоказательствоЗаметим, что yiyj = −1 тогда и только тогда, когда vi и vj лежат вразных полупространствах относительно нашей гиперплоскости T .

P(yi ̸= yj) =𝜃ij𝜋 , где 𝜃ij — угол между векторами vi и vj .

E∑︁i<j

1− yiyj

2wij =

∑︁i<j

𝜃ij

𝜋wij .

∑︁i<j

1− vTi vj

2wij =

∑︁i<j

1− cos 𝜃ij

2wij .

Осталось заметить, что min𝜃2𝜋

𝜃1−cos 𝜃 ≈ 0.87.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 15 / 25

Page 39: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Доказательство (продолжение)

ДоказательствоЗаметим, что yiyj = −1 тогда и только тогда, когда vi и vj лежат вразных полупространствах относительно нашей гиперплоскости T .

P(yi ̸= yj) =𝜃ij𝜋 , где 𝜃ij — угол между векторами vi и vj .

E∑︁i<j

1− yiyj

2wij =

∑︁i<j

𝜃ij

𝜋wij .

∑︁i<j

1− vTi vj

2wij =

∑︁i<j

1− cos 𝜃ij

2wij .

Осталось заметить, что min𝜃2𝜋

𝜃1−cos 𝜃 ≈ 0.87.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 15 / 25

Page 40: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Доказательство (продолжение)

ДоказательствоЗаметим, что yiyj = −1 тогда и только тогда, когда vi и vj лежат вразных полупространствах относительно нашей гиперплоскости T .

P(yi ̸= yj) =𝜃ij𝜋 , где 𝜃ij — угол между векторами vi и vj .

E∑︁i<j

1− yiyj

2wij =

∑︁i<j

𝜃ij

𝜋wij .

∑︁i<j

1− vTi vj

2wij =

∑︁i<j

1− cos 𝜃ij

2wij .

Осталось заметить, что min𝜃2𝜋

𝜃1−cos 𝜃 ≈ 0.87.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 15 / 25

Page 41: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Доказательство (продолжение)

ДоказательствоЗаметим, что yiyj = −1 тогда и только тогда, когда vi и vj лежат вразных полупространствах относительно нашей гиперплоскости T .

P(yi ̸= yj) =𝜃ij𝜋 , где 𝜃ij — угол между векторами vi и vj .

E∑︁i<j

1− yiyj

2wij =

∑︁i<j

𝜃ij

𝜋wij .

∑︁i<j

1− vTi vj

2wij =

∑︁i<j

1− cos 𝜃ij

2wij .

Осталось заметить, что min𝜃2𝜋

𝜃1−cos 𝜃 ≈ 0.87.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 15 / 25

Page 42: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Доказательство (продолжение)

ДоказательствоЗаметим, что yiyj = −1 тогда и только тогда, когда vi и vj лежат вразных полупространствах относительно нашей гиперплоскости T .

P(yi ̸= yj) =𝜃ij𝜋 , где 𝜃ij — угол между векторами vi и vj .

E∑︁i<j

1− yiyj

2wij =

∑︁i<j

𝜃ij

𝜋wij .

∑︁i<j

1− vTi vj

2wij =

∑︁i<j

1− cos 𝜃ij

2wij .

Осталось заметить, что min𝜃2𝜋

𝜃1−cos 𝜃 ≈ 0.87.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 15 / 25

Page 43: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Формулировка в виде задачи полуопределённогопрограммирования

Задача полуопределённого программирования

максимизировать∑︀

i<j1−xij

2 wij

при условии X = {xij}ni ,j=1 ⪰ 0; ∀i , xii = 1

ЗамечанияНайдя оптимальную матрицу X для данной задачи, найдем наборвекторов u1, . . . , un, для которого Xij = uT

i uj (поскольку на диагоналиX стоят 1, все найденные вектора будут единичными).

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 16 / 25

Page 44: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Формулировка в виде задачи полуопределённогопрограммирования

Задача полуопределённого программирования

максимизировать∑︀

i<j1−xij

2 wij

при условии X = {xij}ni ,j=1 ⪰ 0; ∀i , xii = 1

ЗамечанияНайдя оптимальную матрицу X для данной задачи, найдем наборвекторов u1, . . . , un, для которого Xij = uT

i uj (поскольку на диагоналиX стоят 1, все найденные вектора будут единичными).

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 16 / 25

Page 45: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

План лекции

1 Задача полуопределённого программирования

2 Задача о максимальном разрезе

3 Задача о раскраске графа

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 17 / 25

Page 46: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Задача о раскраске графа

ОпределениеЗадача о раскраске графа (graph coloring problem) заключается внахождении по данному графу раскраски его вершин сиспользованием минимального количества цветов так, чтобы концылюбого ребра были покрашены в разные цвета.

ЗамечанияЗадача является NP-трудной.Даже нахождение правильной раскраски в 3 цвета данного3-раскрашиваемого графа является NP-трудной.Проверка же 2-раскрашиваемости проста.Граф всегда можно покрасить в 𝛿 + 1 цвет, где 𝛿 — максимальнаястепень графа.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 18 / 25

Page 47: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Задача о раскраске графа

ОпределениеЗадача о раскраске графа (graph coloring problem) заключается внахождении по данному графу раскраски его вершин сиспользованием минимального количества цветов так, чтобы концылюбого ребра были покрашены в разные цвета.

Замечания

Задача является NP-трудной.Даже нахождение правильной раскраски в 3 цвета данного3-раскрашиваемого графа является NP-трудной.Проверка же 2-раскрашиваемости проста.Граф всегда можно покрасить в 𝛿 + 1 цвет, где 𝛿 — максимальнаястепень графа.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 18 / 25

Page 48: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Задача о раскраске графа

ОпределениеЗадача о раскраске графа (graph coloring problem) заключается внахождении по данному графу раскраски его вершин сиспользованием минимального количества цветов так, чтобы концылюбого ребра были покрашены в разные цвета.

ЗамечанияЗадача является NP-трудной.

Даже нахождение правильной раскраски в 3 цвета данного3-раскрашиваемого графа является NP-трудной.Проверка же 2-раскрашиваемости проста.Граф всегда можно покрасить в 𝛿 + 1 цвет, где 𝛿 — максимальнаястепень графа.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 18 / 25

Page 49: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Задача о раскраске графа

ОпределениеЗадача о раскраске графа (graph coloring problem) заключается внахождении по данному графу раскраски его вершин сиспользованием минимального количества цветов так, чтобы концылюбого ребра были покрашены в разные цвета.

ЗамечанияЗадача является NP-трудной.Даже нахождение правильной раскраски в 3 цвета данного3-раскрашиваемого графа является NP-трудной.

Проверка же 2-раскрашиваемости проста.Граф всегда можно покрасить в 𝛿 + 1 цвет, где 𝛿 — максимальнаястепень графа.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 18 / 25

Page 50: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Задача о раскраске графа

ОпределениеЗадача о раскраске графа (graph coloring problem) заключается внахождении по данному графу раскраски его вершин сиспользованием минимального количества цветов так, чтобы концылюбого ребра были покрашены в разные цвета.

ЗамечанияЗадача является NP-трудной.Даже нахождение правильной раскраски в 3 цвета данного3-раскрашиваемого графа является NP-трудной.Проверка же 2-раскрашиваемости проста.

Граф всегда можно покрасить в 𝛿 + 1 цвет, где 𝛿 — максимальнаястепень графа.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 18 / 25

Page 51: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Задача о раскраске графа

ОпределениеЗадача о раскраске графа (graph coloring problem) заключается внахождении по данному графу раскраски его вершин сиспользованием минимального количества цветов так, чтобы концылюбого ребра были покрашены в разные цвета.

ЗамечанияЗадача является NP-трудной.Даже нахождение правильной раскраски в 3 цвета данного3-раскрашиваемого графа является NP-трудной.Проверка же 2-раскрашиваемости проста.Граф всегда можно покрасить в 𝛿 + 1 цвет, где 𝛿 — максимальнаястепень графа.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 18 / 25

Page 52: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Раскраска 3-раскрашиваемого графа в√

n цветов

Раскраска 3-раскрашиваемого графа в√

n цветов

Рассмотрим произвольную вершину i и всех её соседей N(i).Ясно, что N(i) можно покрасить в два цвета.Алгоритм: пока есть вершина степени хотя бы

√n, покрасим её

соседей в новые два цвета и выкинем их всех из графа; через неболее чем

√n таких операций останется граф степени менее

√n,

который мы покрасим в новые√

n цветов.Потратим, таким образом, не более чем 3

√n цветов.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 19 / 25

Page 53: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Раскраска 3-раскрашиваемого графа в√

n цветов

Раскраска 3-раскрашиваемого графа в√

n цветовРассмотрим произвольную вершину i и всех её соседей N(i).

Ясно, что N(i) можно покрасить в два цвета.Алгоритм: пока есть вершина степени хотя бы

√n, покрасим её

соседей в новые два цвета и выкинем их всех из графа; через неболее чем

√n таких операций останется граф степени менее

√n,

который мы покрасим в новые√

n цветов.Потратим, таким образом, не более чем 3

√n цветов.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 19 / 25

Page 54: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Раскраска 3-раскрашиваемого графа в√

n цветов

Раскраска 3-раскрашиваемого графа в√

n цветовРассмотрим произвольную вершину i и всех её соседей N(i).Ясно, что N(i) можно покрасить в два цвета.

Алгоритм: пока есть вершина степени хотя бы√

n, покрасим еёсоседей в новые два цвета и выкинем их всех из графа; через неболее чем

√n таких операций останется граф степени менее

√n,

который мы покрасим в новые√

n цветов.Потратим, таким образом, не более чем 3

√n цветов.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 19 / 25

Page 55: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Раскраска 3-раскрашиваемого графа в√

n цветов

Раскраска 3-раскрашиваемого графа в√

n цветовРассмотрим произвольную вершину i и всех её соседей N(i).Ясно, что N(i) можно покрасить в два цвета.Алгоритм: пока есть вершина степени хотя бы

√n, покрасим её

соседей в новые два цвета и выкинем их всех из графа; через неболее чем

√n таких операций останется граф степени менее

√n,

который мы покрасим в новые√

n цветов.

Потратим, таким образом, не более чем 3√

n цветов.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 19 / 25

Page 56: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Раскраска 3-раскрашиваемого графа в√

n цветов

Раскраска 3-раскрашиваемого графа в√

n цветовРассмотрим произвольную вершину i и всех её соседей N(i).Ясно, что N(i) можно покрасить в два цвета.Алгоритм: пока есть вершина степени хотя бы

√n, покрасим её

соседей в новые два цвета и выкинем их всех из графа; через неболее чем

√n таких операций останется граф степени менее

√n,

который мы покрасим в новые√

n цветов.Потратим, таким образом, не более чем 3

√n цветов.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 19 / 25

Page 57: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Векторная 3-раскрашиваемость

ОпределениеГраф называется векторно 3-раскрашиваемым (vector 3-colorable),если каждой вершине графа можно приписать вектор так, что длялюбого ребра (i , j) ∈ E выполнено равенство vT

i vj = −1/2 (и векторно2-раскрашиваемым, если vT

i vj = −1).

ЗамечанияЛюбой 3-раскрашиваемый граф является векторно3-раскрашиваемым. Обратное, вообще говоря, неверно.А вот 2-раскрашиваемость эквивалентна векторной2-раскрашиваемости.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 20 / 25

Page 58: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Векторная 3-раскрашиваемость

ОпределениеГраф называется векторно 3-раскрашиваемым (vector 3-colorable),если каждой вершине графа можно приписать вектор так, что длялюбого ребра (i , j) ∈ E выполнено равенство vT

i vj = −1/2 (и векторно2-раскрашиваемым, если vT

i vj = −1).

Замечания

Любой 3-раскрашиваемый граф является векторно3-раскрашиваемым. Обратное, вообще говоря, неверно.А вот 2-раскрашиваемость эквивалентна векторной2-раскрашиваемости.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 20 / 25

Page 59: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Векторная 3-раскрашиваемость

ОпределениеГраф называется векторно 3-раскрашиваемым (vector 3-colorable),если каждой вершине графа можно приписать вектор так, что длялюбого ребра (i , j) ∈ E выполнено равенство vT

i vj = −1/2 (и векторно2-раскрашиваемым, если vT

i vj = −1).

ЗамечанияЛюбой 3-раскрашиваемый граф является векторно3-раскрашиваемым. Обратное, вообще говоря, неверно.

А вот 2-раскрашиваемость эквивалентна векторной2-раскрашиваемости.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 20 / 25

Page 60: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Векторная 3-раскрашиваемость

ОпределениеГраф называется векторно 3-раскрашиваемым (vector 3-colorable),если каждой вершине графа можно приписать вектор так, что длялюбого ребра (i , j) ∈ E выполнено равенство vT

i vj = −1/2 (и векторно2-раскрашиваемым, если vT

i vj = −1).

ЗамечанияЛюбой 3-раскрашиваемый граф является векторно3-раскрашиваемым. Обратное, вообще говоря, неверно.А вот 2-раскрашиваемость эквивалентна векторной2-раскрашиваемости.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 20 / 25

Page 61: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Половинная раскраска

ОпределениеПоловинной раскраской (half-coloring) графа называется правильнаяраскраска хотя бы половины вершин графа.

ЗамечаниеЕсли половинная раскраска графа в n𝛼 цветов может быть найдена заполиномиальное время, то граф можно полностью раскрасить заполиномиальное время в

n𝛼 +(︁n

2

)︁𝛼+ · · · = O(n𝛼)

цветов.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 21 / 25

Page 62: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Половинная раскраска

ОпределениеПоловинной раскраской (half-coloring) графа называется правильнаяраскраска хотя бы половины вершин графа.

ЗамечаниеЕсли половинная раскраска графа в n𝛼 цветов может быть найдена заполиномиальное время, то граф можно полностью раскрасить заполиномиальное время в

n𝛼 +(︁n

2

)︁𝛼+ · · · = O(n𝛼)

цветов.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 21 / 25

Page 63: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Алгоритм и его анализ

Алгоритм и его анализ

Найдём необходимый набор векторов, решив соответствующуюзадачу полуопределённого программирования.Случайно выбранная гиперплоскость разделяет два вектора vi , vjдля (i , j) ∈ E с вероятностью 2/3.Такая гиперплоскость, таким образом, может быть использованадля покраски вершин в два цвета с мат. ожиданием количестваодноцветных рёбер, равным одной трети общего количества рёбер.Если же провести r случайных гиперплоскостей и покраситьвершины в соответствующие 2r цветов, то ребро графа будетодноцветным с вероятностью 1/3r .Тогда мат. ожидание количества одноцветных рёбер равно|E |/3r = dn

2·3r < n/4, если r ≥ log3 d + 1, где d — средняя степеньграфа.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 22 / 25

Page 64: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Алгоритм и его анализ

Алгоритм и его анализНайдём необходимый набор векторов, решив соответствующуюзадачу полуопределённого программирования.

Случайно выбранная гиперплоскость разделяет два вектора vi , vjдля (i , j) ∈ E с вероятностью 2/3.Такая гиперплоскость, таким образом, может быть использованадля покраски вершин в два цвета с мат. ожиданием количестваодноцветных рёбер, равным одной трети общего количества рёбер.Если же провести r случайных гиперплоскостей и покраситьвершины в соответствующие 2r цветов, то ребро графа будетодноцветным с вероятностью 1/3r .Тогда мат. ожидание количества одноцветных рёбер равно|E |/3r = dn

2·3r < n/4, если r ≥ log3 d + 1, где d — средняя степеньграфа.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 22 / 25

Page 65: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Алгоритм и его анализ

Алгоритм и его анализНайдём необходимый набор векторов, решив соответствующуюзадачу полуопределённого программирования.Случайно выбранная гиперплоскость разделяет два вектора vi , vjдля (i , j) ∈ E с вероятностью 2/3.

Такая гиперплоскость, таким образом, может быть использованадля покраски вершин в два цвета с мат. ожиданием количестваодноцветных рёбер, равным одной трети общего количества рёбер.Если же провести r случайных гиперплоскостей и покраситьвершины в соответствующие 2r цветов, то ребро графа будетодноцветным с вероятностью 1/3r .Тогда мат. ожидание количества одноцветных рёбер равно|E |/3r = dn

2·3r < n/4, если r ≥ log3 d + 1, где d — средняя степеньграфа.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 22 / 25

Page 66: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Алгоритм и его анализ

Алгоритм и его анализНайдём необходимый набор векторов, решив соответствующуюзадачу полуопределённого программирования.Случайно выбранная гиперплоскость разделяет два вектора vi , vjдля (i , j) ∈ E с вероятностью 2/3.Такая гиперплоскость, таким образом, может быть использованадля покраски вершин в два цвета с мат. ожиданием количестваодноцветных рёбер, равным одной трети общего количества рёбер.

Если же провести r случайных гиперплоскостей и покраситьвершины в соответствующие 2r цветов, то ребро графа будетодноцветным с вероятностью 1/3r .Тогда мат. ожидание количества одноцветных рёбер равно|E |/3r = dn

2·3r < n/4, если r ≥ log3 d + 1, где d — средняя степеньграфа.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 22 / 25

Page 67: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Алгоритм и его анализ

Алгоритм и его анализНайдём необходимый набор векторов, решив соответствующуюзадачу полуопределённого программирования.Случайно выбранная гиперплоскость разделяет два вектора vi , vjдля (i , j) ∈ E с вероятностью 2/3.Такая гиперплоскость, таким образом, может быть использованадля покраски вершин в два цвета с мат. ожиданием количестваодноцветных рёбер, равным одной трети общего количества рёбер.Если же провести r случайных гиперплоскостей и покраситьвершины в соответствующие 2r цветов, то ребро графа будетодноцветным с вероятностью 1/3r .

Тогда мат. ожидание количества одноцветных рёбер равно|E |/3r = dn

2·3r < n/4, если r ≥ log3 d + 1, где d — средняя степеньграфа.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 22 / 25

Page 68: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Алгоритм и его анализ

Алгоритм и его анализНайдём необходимый набор векторов, решив соответствующуюзадачу полуопределённого программирования.Случайно выбранная гиперплоскость разделяет два вектора vi , vjдля (i , j) ∈ E с вероятностью 2/3.Такая гиперплоскость, таким образом, может быть использованадля покраски вершин в два цвета с мат. ожиданием количестваодноцветных рёбер, равным одной трети общего количества рёбер.Если же провести r случайных гиперплоскостей и покраситьвершины в соответствующие 2r цветов, то ребро графа будетодноцветным с вероятностью 1/3r .Тогда мат. ожидание количества одноцветных рёбер равно|E |/3r = dn

2·3r < n/4, если r ≥ log3 d + 1, где d — средняя степеньграфа.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 22 / 25

Page 69: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Алгоритм и его анализ (завершение)

Алгоритм и его анализ (завершение)

С большой вероятностью, таким образом, количествоодноцветных рёбер будет меньше n/2.Сотрём цвет одного из концов каждого одноцветного ребра иполучим половинную раскраску.Использовали 2r = O(d log2 3) = O(d0.631) цветов.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 23 / 25

Page 70: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Алгоритм и его анализ (завершение)

Алгоритм и его анализ (завершение)С большой вероятностью, таким образом, количествоодноцветных рёбер будет меньше n/2.

Сотрём цвет одного из концов каждого одноцветного ребра иполучим половинную раскраску.Использовали 2r = O(d log2 3) = O(d0.631) цветов.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 23 / 25

Page 71: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Алгоритм и его анализ (завершение)

Алгоритм и его анализ (завершение)С большой вероятностью, таким образом, количествоодноцветных рёбер будет меньше n/2.Сотрём цвет одного из концов каждого одноцветного ребра иполучим половинную раскраску.

Использовали 2r = O(d log2 3) = O(d0.631) цветов.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 23 / 25

Page 72: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Алгоритм и его анализ (завершение)

Алгоритм и его анализ (завершение)С большой вероятностью, таким образом, количествоодноцветных рёбер будет меньше n/2.Сотрём цвет одного из концов каждого одноцветного ребра иполучим половинную раскраску.Использовали 2r = O(d log2 3) = O(d0.631) цветов.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 23 / 25

Page 73: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Что мы узнали за сегодня?

Что мы узнали за сегодня?

Задача полуопределённого программирования заключается вминимизации (максимизации) линейной функции при условииположительной полуопределённости некоторой матрицы.Данная задача решается за полиномиальное время с любойзаданной заранее аддитивной ошибкой.Используя этот алгоритм, можно за полиномиальное время найти0.87-приближение для задачи о максимальном разрезе ипокрасить в d0.631 цветов 3-раскрашиваемый граф.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 24 / 25

Page 74: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Что мы узнали за сегодня?

Что мы узнали за сегодня?Задача полуопределённого программирования заключается вминимизации (максимизации) линейной функции при условииположительной полуопределённости некоторой матрицы.

Данная задача решается за полиномиальное время с любойзаданной заранее аддитивной ошибкой.Используя этот алгоритм, можно за полиномиальное время найти0.87-приближение для задачи о максимальном разрезе ипокрасить в d0.631 цветов 3-раскрашиваемый граф.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 24 / 25

Page 75: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Что мы узнали за сегодня?

Что мы узнали за сегодня?Задача полуопределённого программирования заключается вминимизации (максимизации) линейной функции при условииположительной полуопределённости некоторой матрицы.Данная задача решается за полиномиальное время с любойзаданной заранее аддитивной ошибкой.

Используя этот алгоритм, можно за полиномиальное время найти0.87-приближение для задачи о максимальном разрезе ипокрасить в d0.631 цветов 3-раскрашиваемый граф.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 24 / 25

Page 76: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Что мы узнали за сегодня?

Что мы узнали за сегодня?Задача полуопределённого программирования заключается вминимизации (максимизации) линейной функции при условииположительной полуопределённости некоторой матрицы.Данная задача решается за полиномиальное время с любойзаданной заранее аддитивной ошибкой.Используя этот алгоритм, можно за полиномиальное время найти0.87-приближение для задачи о максимальном разрезе ипокрасить в d0.631 цветов 3-раскрашиваемый граф.

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 24 / 25

Page 77: Эффективные алгоритмы, осень 2007: Приближённые алгоритмы

Спасибо за внимание!

А. Куликов (CS клуб при ПОМИ) 5. Полуопр. программирование 25 / 25