Cod sursa(job #2798839)

Utilizator bostanlucastefanBostan Luca-Stefan bostanlucastefan Data 11 noiembrie 2021 23:26:44
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
#include <vector>
#define pb push_back

using namespace std;

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

const int N=1e4+2;

int n,m,k,x,y,ans,i;
int st[N],dr[N];
bool vis[N],ok;

vector<int> asc[N];

bool dfs(int now)
{
    if(vis[now])
        return false;

    vis[now]=true;
    for(auto& i:asc[now])
        if(!st[i])
        {
            st[i]=now;
            dr[now]=i;
            return true;
        }
    for(auto& i:asc[now])
        if(dfs(st[i]))
        {
            st[i]=now;
            dr[now]=i;
            return true;
        }
    return false;
}

int main()
{
    fin>>n>>m>>k;
    for(i=1; i<=k; i++)
        fin>>x>>y, asc[x].pb(y);

    ok=true;
    while(ok)
    {
        ok=false;
        for(i=1; i<=n; i++)
            vis[i]=false;
        for(i=1; i<=n; i++)
            if(!dr[i] && dfs(i))
                ok=true, ans++;
    }

    fout<<ans<<'\n';
    for(i=1; i<=n; i++)
        if(dr[i])
            fout<<i<<' '<<dr[i]<<'\n';
    return 0;
}