Алгоритм Куна: различия между версиями

Материал из Олимпиадное программирование в УлГТУ
Перейти к навигации Перейти к поиску
Нет описания правки
Строка 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 &mdash; Алгоритм Куна нахождения наибольшего паросочетания в двудольном графе]
Теория:
* [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 &mdash; Алгоритм Куна для поиска максимального паросочетания]
* [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]
* [http://github.com/indy256/codelibrary/blob/master/java/src/MaxMatching.java CodeLibrary &mdash; Maximum matching for bipartite graph. Kuhn's algorithm in O(V^3)]
Код:
* [http://github.com/indy256/codelibrary/blob/master/java/src/MaxMatching2.java CodeLibrary &mdash; Maximum matching for bipartite graph. Kuhn's algorithm in O(EV)]
* [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 Algos &mdash; Kuhn algorithm for maximum matching in bipartite graph]
* [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);
    }
}

Ссылки

Теория:

Код: