Посоветуйте, где можно про него прочитать? Я читал вот тут: http://e-maxx.ru/algo/matching_edmonds, а потом решал задачу 1099 с тимуса, но она заTLилиась. Мой код практически идентичен e-maxxовскому. Кстати, вот код. Заранее спасибо за помощь.
№ | Пользователь | Рейтинг |
---|---|---|
1 | tourist | 3993 |
2 | jiangly | 3743 |
3 | orzdevinwang | 3707 |
4 | Radewoosh | 3627 |
5 | jqdai0815 | 3620 |
6 | Benq | 3564 |
7 | Kevin114514 | 3443 |
8 | ksun48 | 3434 |
9 | Rewinding | 3397 |
10 | Um_nik | 3396 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 167 |
2 | Um_nik | 163 |
3 | maomao90 | 162 |
3 | atcoder_official | 162 |
5 | adamant | 159 |
6 | -is-this-fft- | 158 |
7 | awoo | 155 |
8 | TheScrasse | 154 |
9 | Dominater069 | 153 |
10 | djm03178 | 152 |
Название |
---|
int e[230][230];
int e_sz[230]; // размер
работает раз 5-10 быстрее, чем
vector<int> e[230];
Как я понял, Kenny_HORROR всё же реализовывал самостоятельно, так что вероятность баги у меня ненулевая.
Сейчас снова попробую стресс устроить.
Да, красятся только базы, но что такое база? Это сжатый номер вершины. Ну здесь прямо напрашивается аналогия с DSU: мы красим не сам элемент, а всё множество целиком, для чего надо покрасить только представителя этого множества, а потом при проверке "покрашенности" смотреть всегда только на представителя (в нашем случае всегда пишется "if (blossom[base[i]])").
База base[v] на момент входа в функцию - это пока не база обнаруженного цветка, это сжатый номер вершины в DSU. Задача этой функции - в том, чтобы пройтись от текущей вершины до корня обнаруженного цветка, и для каждой нечётной вершины проставить предка p[]. Этот процесс лучше по бумажке понять (в статью бы тоже было бы круто вставить картинку, но у меня большая лень на картинки, как можно заметить по всему сайту :))) ). Ещё раз, суть в том, что обход в ширину проставляет p[] только для вторых концов рёбер паросочетания; функция же mark_path проставляет p[] для первых концов паросочетания, но в обратную сторону. Т.е. если предки, проставленные обходом в ширину, ведут "вверх" по дереву обхода, то предки, доставленные mark_path'ом, ведут обратно "вниз".
Это и правда очень хитрый момент алгоритма, самый вынос мозга :) Такая хрень с предками нужна, чтобы по предкам всегда можно было дойти до корня цветка, встав в любую точку цветка. Ведь обход в ширину даёт информацию о предках только для чётных вершин (вторых концов рёбер парсоча); предки же из нечётных вершин должны вести по циклу в противоположную сторону, иначе мы из нечётной вершины ну никак не придём чередующимся путём в корень цветка.
Вот :) Несколько сумбурно, но может, чуть лучше, чем в статье написано.
Вершина всегда имеет базу, только до всяких цветков база указывает на саму же вершину.
mark_path проставляет предков до того, как мы все вершины цветка сожмём в одну, он работает со старыми базами.
Кристофидес "Теория графов"
плюс гугли статьи. их не очень много по этому алгоритму написано. у тарьяна, насколько я помню, была в том числе статья.
Вообще по-моему алгоритм Эдмондса очень красивый, мне нравится это элегантный перенос алгоритма Куна на произвольные графы. Имхо один из самых красивых алгоритмов.
Жаль только, что с реализацией большие сложности возникают...