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

Материал из Олимпиадное программирование в УлГТУ
Перейти к навигации Перейти к поиску
(Отмена правки 2793, сделанной Ctrlalt (обсуждение))
Метка: отмена
Нет описания правки
Строка 20: Строка 20:
         vector<int> visited(graphA.size());
         vector<int> visited(graphA.size());
         dfs(graphA, vFromA, visited, pairFromA);
         dfs(graphA, vFromA, visited, pairFromA);
    }
    return pairFromA;
}
vector<int> kuhnWithGreedyInitialization(vector<vector<int>> &graphA, int vertexCountB) {
    vector<int> pairFromA(vertexCountB, -1), greedyVisited(graphA.size());
    for (int vFromA = 0; vFromA < graphA.size(); vFromA++) {
        for (int vFromB : graphA[vFromA]) {
            if (pairFromA[vFromB] == -1) {
                pairFromA[vFromB] = vFromA;
                greedyVisited[vFromA] = 1;
                break;
            }
        }
    }
    for (int vFromA = 0; vFromA < graphA.size(); vFromA++) {
        if (!greedyVisited[vFromA]) {
            vector<int> visited(graphA.size());
            dfs(graphA, vFromA, visited, pairFromA);
        }
     }
     }
   
   

Версия от 01:02, 29 сентября 2022

bool dfs(vector<vector<int>> &graphA, int vFromA, vector<int> &visited, vector<int> &pairFromA) {
    visited[vFromA] = 1;

    for (int vFromB : graphA[vFromA]) {
        int &toFromA = pairFromA[vFromB];

        if (toFromA == -1 || !visited[toFromA] && dfs(graphA, toFromA, visited, pairFromA)) {
            toFromA = vFromA;
            return 1;
        }
    }

    return 0;
}

vector<int> kuhn(vector<vector<int>> &graphA, int vertexCountB) {
    vector<int> pairFromA(vertexCountB, -1);

    for (int vFromA = 0; vFromA < graphA.size(); vFromA++) {
        vector<int> visited(graphA.size());
        dfs(graphA, vFromA, visited, pairFromA);
    }

    return pairFromA;
}
vector<int> kuhnWithGreedyInitialization(vector<vector<int>> &graphA, int vertexCountB) {
    vector<int> pairFromA(vertexCountB, -1), greedyVisited(graphA.size());

    for (int vFromA = 0; vFromA < graphA.size(); vFromA++) {
        for (int vFromB : graphA[vFromA]) {
            if (pairFromA[vFromB] == -1) {
                pairFromA[vFromB] = vFromA;
                greedyVisited[vFromA] = 1;
                break;
            }
        }
    }

    for (int vFromA = 0; vFromA < graphA.size(); vFromA++) {
        if (!greedyVisited[vFromA]) {
            vector<int> visited(graphA.size());
            dfs(graphA, vFromA, visited, pairFromA);
        }
    }

    return pairFromA;
}

Ссылки

Теория:

Код: