Cod sursa(job #2936085)

Utilizator Samoila_AlexandruSamoilaAlexandru Samoila_Alexandru Data 7 noiembrie 2022 23:42:29
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
#include <vector>

using namespace std;

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

const int dim=1e4+1;

vector<int> g[dim];
int n, m, e;
bool v[dim];

int st[dim], dr[dim], sol;

bool cuplaj(int i)
{
    if(v[i])
        return false;

    v[i]=1;

    for(int k : g[i])
        if(!dr[k])
    {
        st[i]=k;
        dr[k]=i;
        return true;
    }

    for(int k : g[i])
        if(cuplaj(dr[k]))
    {
        st[i]=k;
        dr[k]=i;
        return true;
    }

    return false;
}

int main()
{
    fin>>n>>m>>e;

    for(int i=1; i<=e; i++)
    {
        int x, y;
        fin>>x>>y;
        g[x].push_back(y);
    }
    fin.close();

    bool ok=true;

    while(ok)
    {
        ok=false;

        for(int i=1; i<=n; i++)
            v[i]=0;

        for(int i=1; i<=n; i++)
            if(st[i]==0 && cuplaj(i))
        {
            ok=true;
            sol++;
        }
    }


    fout<<sol<<'\n';

    for(int i=1; i<=n; i++)
        if(st[i])
        fout<<i<<' '<<st[i]<<'\n';

    fout.close();
    return 0;
}