Cod sursa(job #3250143)

Utilizator paull122Paul Ion paull122 Data 19 octombrie 2024 14:13:32
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <bits/stdc++.h>

#define VMAX 100000
#define NMAX 10000
#define LOG 17
#define INF (long long)(1e9)
#define MOD 1000000007
#define ll long long int

#define ADD 1000001

#define NIL 0

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


int n,m,e;

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

bool bfs()
{
    dist[NIL] = INF;
    queue<int> Q;
    for(int i=1;i<=n;i++)
    {
        if(pairU[i]==NIL)
        {
            dist[i]=0;
            Q.push(i);
        }
        else
        {
            dist[i] = 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;
    for(int i=1;i<=e;i++)
    {
        int u,v;
        fin >> u >> v;
        adj[u].push_back(v);
    }

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