Алгоритм Куна



Необходимо в двудольном графе найти максимальное паросочетание

Возможна и следующая формулировка:

Необходимо в двудольном графе найти минимальноё рёберное покрытие


Алгоритм Куна основан на методе чередующихся цепей.

Асимптотика O(NM).


Листинг C++

bool dfs_kuhn (int &v, vector < vector < int > > &e, vector < int > &is, vector < int > &p)
{
    if (is[v]) return 0;
    is[v] = 1;
    for (int i = 0; i < e[v].size (); ++ i)
    {
        int u = e[v][i] - is.size ();
        if (p[u] == - 1 || dfs_kuhn (p[u], e, is, p))
        {
            p[u] = v;
            return 1;
        }
    }
    return 0;
}

void kuhn (int n, int m, vector < vector < int > > &e, vector < int > &p)
{
    p.assign (m, - 1);
    for (int i = 0; i < n; ++ i)
    {
        vector < int > is (n, 0);
        dfs_kuhn (i, e, is, p);
    }
}

31.05.2007, 08:10



По всем вопросам обращаться: rumterg@gmail.com