Cod sursa(job #2116788)

Utilizator FredyLup Lucia Fredy Data 27 ianuarie 2018 22:58:20
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

#define lim 10010
int A[lim], B[lim], a, b, m;
vector <int> G[lim];
bool viz[lim];

bool pair_up (int nod)
{
    if (viz[nod])   return false;
    viz[nod]=1;

    for (auto it:G[nod])
        if (!B[it])
        {
            A[nod]=it;
            B[it]=nod;
            return true;
        }

    for (auto it:G[nod])
        if (pair_up(B[it]))
        {
            B[it]=nod;
            A[nod]=it;
            return true;
        }
    return false;
}

int main()
{
    int x,y;
    fin>>a>>b>>m;
    for (int i=1; i<=m; i++)
    {
        fin>>x>>y;
        G[x].push_back(y);
    }

    bool ok=1;
    while (ok)
    {
        ok=0;
        for (int i=1; i<=a; i++)    viz[i]=0;
        for (int i=1; i<=a; i++)
            if (!A[i])
                ok |= pair_up (i);
    }

    int rez=0;
    for (int i=1; i<=a; i++)
        if (A[i])   rez++;
    fout<<rez<<'\n';
    for (int i=1; i<=a; i++) if (A[i])
        fout<<i<<' '<<A[i]<<'\n';

    return 0;
}