Cod sursa(job #1938616)

Utilizator radu.leonardoThe Doctor radu.leonardo Data 24 martie 2017 22:02:31
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.38 kb
#include<bits/stdc++.h>
using namespace std;
#define NIL 0
#define INF INT_MAX
int *pairU, *pairV, *dist;
class BipGraph
{

    int m, n;
    list<int> *adj;


public:
    BipGraph(int m, int n);
    void addEdge(int u, int v);
    bool bfs();
    bool dfs(int u);
    int hopcroftKarp();
};

int BipGraph::hopcroftKarp()
{
    pairU = new int[m+1];
    pairV = new int[n+1];
    dist = new int[m+1];
    for (int u=0; u<m; u++)
        pairU[u] = NIL;
    for (int v=0; v<n; v++)
        pairV[v] = NIL;


    int result = 0;
    while (bfs())
    {
        for (int u=1; u<=m; u++)
            if (pairU[u]==NIL && dfs(u))
                result++;
    }
    return result;
}

bool BipGraph::bfs()
{
    queue<int> Q;
    for (int u=1; u<=m; u++)
    {
        if (pairU[u]==NIL)
        {
            dist[u] = 0;
            Q.push(u);
        }
        else dist[u] = INF;
    }

    dist[NIL] = INF;
    while (!Q.empty())
    {

        int u = Q.front();
        Q.pop();

        if (dist[u] < dist[NIL])
        {

            list<int>::iterator i;
            for (i=adj[u].begin(); i!=adj[u].end(); ++i)
            {
                int v = *i;


                if (dist[pairV[v]] == INF)
                {
                    dist[pairV[v]] = dist[u] + 1;
                    Q.push(pairV[v]);
                }
            }
        }
    }


    return (dist[NIL] != INF);
}

bool BipGraph::dfs(int u)
{
    if (u != NIL)
    {
        list<int>::iterator i;
        for (i=adj[u].begin(); i!=adj[u].end(); ++i)
        {
            int v = *i;

            if (dist[pairV[v]] == dist[u]+1)
            {
                if (dfs(pairV[v]) == true)
                {
                    pairV[v] = u;
                    pairU[u] = v;
                    return true;
                }
            }
        }


        dist[u] = INF;
        return false;
    }
    return true;
}


BipGraph::BipGraph(int m, int n)
{
    this->m = m;
    this->n = n;
    adj = new list<int>[m+1];
}

void BipGraph::addEdge(int u, int v)
{
    adj[u].push_back(v);
    adj[v].push_back(u);
}

int main()
{
    int n,m,k;
    ifstream fin("cuplaj.in");
    ofstream fout("cuplaj.out");
    fin>>n>>m;
    BipGraph g(n, m);
    for(int i=1;i<=k;i++)
    {
        int a,b;
        fin>>a>>b;
        g.addEdge(a,b);
    }


    fout<<g.hopcroftKarp()<<'\n';
    for (int i=1;i<=n;++i)
         if (pairV[i]) fout<<i<<" "<<pairV[i]<<'\n';

}