Алгоритм Куна: различия между версиями
Перейти к навигации
Перейти к поиску
Ctrlalt (обсуждение | вклад) (→Ссылки) |
Ctrlalt (обсуждение | вклад) Нет описания правки |
||
Строка 1: | Строка 1: | ||
vector<vector<int>> g; | |||
vector<int> pairFromA; | |||
vector<int> visited; | |||
bool dfs(int vFromA) { | |||
visited[vFromA] = 1; | |||
for (int vFromB : g[vFromA]) { | |||
int &to = pairFromA[vFromB]; | |||
if (to == -1 || !visited[to] && dfs(to)) { | |||
to = vFromA; | |||
return 1; | |||
} | |||
} | |||
return 0; | |||
} | |||
void kuhn(int aSize, int bSize) { | |||
pairFromA.assign(bSize, -1); | |||
for (int vFromA = 0; vFromA < aSize; vFromA++) { | |||
visited.assign(aSize, 0); | |||
dfs(vFromA); | |||
} | |||
} | |||
== Ссылки == | == Ссылки == | ||
* [http://e-maxx.ru/algo/kuhn_matching e-maxx.ru | Теория: | ||
* [http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D1%83%D0%BD%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BF%D0%B0%D1%80%D0%BE%D1%81%D0%BE%D1%87%D0%B5%D1%82%D0%B0%D0%BD%D0%B8%D1%8F neerc.ifmo.ru/wiki | * [http://e-maxx.ru/algo/kuhn_matching e-maxx.ru — Алгоритм Куна нахождения наибольшего паросочетания в двудольном графе] | ||
* [http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D1%83%D0%BD%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BF%D0%B0%D1%80%D0%BE%D1%81%D0%BE%D1%87%D0%B5%D1%82%D0%B0%D0%BD%D0%B8%D1%8F neerc.ifmo.ru/wiki — Алгоритм Куна для поиска максимального паросочетания] | |||
* [https://algorithmica.org/ru/matching algorithmica.org — Паросочетания] | |||
* [https://codeforces.com/blog/entry/17023 Codeforces — Паросочетание. Быстрый Кун] | |||
* [http://brilliant.org/wiki/matching-algorithms Brilliant.org — Matching Algorithms] | * [http://brilliant.org/wiki/matching-algorithms Brilliant.org — Matching Algorithms] | ||
* [ | Код: | ||
* [https://github.com/indy256/codelibrary/blob/master/cpp/graphs/matchings/max_bipartite_matching_EV.cpp codelibrary/cpp/graphs/matchings/max_bipartite_matching_EV.cpp] | |||
* [http://github.com/ADJA/algos/blob/master/Graphs/BipartiteMatchingKuhn.cpp | * [http://github.com/ADJA/algos/blob/master/Graphs/BipartiteMatchingKuhn.cpp algos/Graphs/BipartiteMatchingKuhn.cpp] |
Версия от 20:55, 24 сентября 2020
vector<vector<int>> g; vector<int> pairFromA; vector<int> visited; bool dfs(int vFromA) { visited[vFromA] = 1; for (int vFromB : g[vFromA]) { int &to = pairFromA[vFromB]; if (to == -1 || !visited[to] && dfs(to)) { to = vFromA; return 1; } } return 0; } void kuhn(int aSize, int bSize) { pairFromA.assign(bSize, -1); for (int vFromA = 0; vFromA < aSize; vFromA++) { visited.assign(aSize, 0); dfs(vFromA); } }
Ссылки
Теория:
- e-maxx.ru — Алгоритм Куна нахождения наибольшего паросочетания в двудольном графе
- neerc.ifmo.ru/wiki — Алгоритм Куна для поиска максимального паросочетания
- algorithmica.org — Паросочетания
- Codeforces — Паросочетание. Быстрый Кун
- Brilliant.org — Matching Algorithms
Код: