Cod sursa(job #3239820)

Utilizator paull122Paul Ion paull122 Data 7 august 2024 18:54:15
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <bits/stdc++.h>

#define VMAX 100
#define NMAX 10000
#define LOG 21
#define INF (int)(10e8)
#define MOD 1000000007
#define ll  unsigned long long int


#define NIL 0

using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

int n,m,e;
vector<int> adj[NMAX+1];
int dist[NMAX+1];
int pairU[NMAX+1],pairV[NMAX+1];


bool bfs()
{
    queue<int> Q;
    for(int i=1;i<=n;++i)
    {
        if(!pairU[i])
        {
            Q.push(i);
            dist[i]=0;
        }
        else
        {
            dist[i]=INF;
        }
    }
    dist[NIL]=INF;
    while(!Q.empty())
    {
        int u = Q.front();
        Q.pop();
        if(dist[u] < dist[NIL])
        {
            for(int v : adj[u])
            {
                if(dist[pairV[v]] > dist[u] + 1)
                {
                    dist[pairV[v]] = dist[u] + 1;
                    Q.push(pairV[v]);
                }
            }
        }
    }
    return dist[NIL]!=INF;
}
bool dfs(int u)
{
    if(u==NIL)
    {
        return 1;
    }
    for(int v : adj[u])
    {
        if(dist[pairV[v]] == dist[u] + 1 && dfs(pairV[v]))
        {
            pairU[u] = v;
            pairV[v] = u;
            return  1;
        }
    }
    dist[u] = INF;
    return 0;
}
int main()
{
    fin >> n >> m >> e;
    while(e--)
    {
        int x,y;
        fin >> x >> y;
        adj[x].push_back(y);
    }
    for(int i=1;i<=n;i++)
    {
        pairU[i]=NIL;
    }
    for(int i=1;i<=m;i++)
    {
        pairV[i]=NIL;
    }


    int matching = 0;
    while(bfs())
    {
        for(int i=1;i<=n;i++)
        {
            if(pairU[i]==NIL)
            {
                matching += dfs(i);
            }
        }
    }
    fout << matching << '\n';
    for(int i=1;i<=n;i++)
    {
        if(pairU[i] != NIL)
        {
            fout << i << " " << pairU[i] << '\n';
        }
    }

}