Cod sursa(job #2960192)

Utilizator ScobiolaRaduScobiola Radu ScobiolaRadu Data 3 ianuarie 2023 18:32:40
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.05 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("cuplaj.in");
ofstream out("cuplaj.out");


int n, m, e;

list<int> adj[20001];

int pairL[20001], pairR[20001], dist[20001];

bool bfs()
{
    queue<int> q;

    for(int u = 1; u <= n; u++)
        if(pairL[u] == 0)
        {
            dist[u] = 0;
            q.push(u);
        }

        else dist[u] = 999999;

    dist[0] = 999999;

    while(!q.empty())
    {
        int u = q.front();
        q.pop();

        if(dist[u] < dist[0])
        {
            list<int>::iterator i;
            for(i=adj[u].begin(); i!=adj[u].end(); i++)
            {
                int v = *i;
                if(dist[pairR[v]] == 999999)
                {
                    dist[pairR[v]] = dist[u] + 1;
                    q.push(pairR[v]);
                }
            }
        }
    }

    return (dist[0] != 999999);

}

bool dfs(int u)
{
    if(u != 0)
    {
        list<int>::iterator i;
        for(i=adj[u].begin(); i!=adj[u].end(); i++)
        {
            int v = *i;
            if(dist[pairR[v]] == dist[u] + 1)
            {
                if(dfs(pairR[v]) == true)
                {
                    pairR[v] = u;
                    pairL[u] = v;
                    return true;
                }
            }
        }

        dist[u] = 999999;
        return false;
    }

    return true;
}

void hopcroftKarp()
{

    for(int u = 0; u <= n; u++)
        pairL[u] = 0;
    for(int v = 0; v <= m; v++)
        pairR[v] = 0;

    int result = 0;

    while (bfs())
    {
        for(int u = 1; u <= n; u++)
            if(pairL[u] == 0 && dfs(u))
            {
                result++;
            }
    }

    out<<result<<endl;
    for(int i = 1; i <= n; i++)
        if(pairL[i])
            out<<i<<" "<<pairL[i]<<endl;

}


int main()
{
    int i, a, b;
    in>>n>>m>>e;

    for(i=1; i<=e; i++)
    {
        in>>a>>b;
        adj[a].push_back(b);
    }

    hopcroftKarp();

    return 0;
}