Cod sursa(job #2696288)

Utilizator paulconst1Constantinescu Paul paulconst1 Data 15 ianuarie 2021 17:43:18
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <bits/stdc++.h>
using namespace std;

#define INF (1<<30)

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


vector<int> adj[10003];

int n, m, e, pu[10003], pv[10003], d[10003];

bool bfs()
{
    queue<int> q;
    for(int i=1; i<=n; ++i)
    {
        if(pu[i]==0)
        {
            d[i]=0;
            q.push(i);
        }
        else d[i]=INF;
    }
    d[0]=INF;
    while(!q.empty())
    {
        int i=q.front();
        q.pop();
        if(d[i]<d[0])
        {
            for(auto j:adj[i])
            {
                if(d[pv[j]]==INF)
                {
                    d[pv[j]]=d[i]+1;
                    q.push(pv[j]);
                }
            }
        }
    }
    return d[0]!=INF;
}

bool dfs(int u)
{
    if(u!=0)
    {
        for(auto v:adj[u])
        {
            if(d[pv[v]]==d[u]+1)
            {
                if(dfs(pv[v]))
                {
                    pv[v]=u;
                    pu[u]=v;
                    return 1;
                }
            }
        }
        d[u]=INF;
        return 0;
    }
    return 1;
}

int solve()
{
    for(int u=1; u<=n; ++u) pu[u]=0;
    for(int v=1; v<=m; ++v) pv[v]=0;
    int sol=0;
    while(bfs())
    {
        for(int u=1; u<=n; ++u)
        {
            if(pu[u]==0)
            {
                sol+=dfs(u);
            }
        }
    }
    return sol;
}

int main()
{
    fin>>n>>m>>e;
    for(int i=1; i<=e; ++i)
    {
        int a, b;
        fin>>a>>b;
        adj[a].push_back(b);
    }
    fout<<solve()<<"\n";;
    for(int i=1; i<=n; ++i)
    {
        if(pu[i]) fout<<i<<" "<<pu[i]<<"\n";
    }
    return 0;
}