Cod sursa(job #1164585)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 2 aprilie 2014 10:19:29
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<fstream>
#include<vector>
#define NMAX 10010

using namespace std;

ifstream f("cuplaj.in");
ofstream g("cuplaj.out");

vector<int> a[NMAX];
int nL, nR, m, vz[NMAX], M1[NMAX], M2[NMAX];

void Citeste()
{
    int x, y;

    f>>nL>>nR>>m;
    while (m--)
    {
        f>>x>>y;
        a[x].push_back(y);
    }
}

int cupleaza(int nod)
{
    int i, v;

    if (vz[nod]) return 0;
    vz[nod]=1;

    for (i=0; i<a[nod].size(); ++i)
    {
            v=a[nod][i];

            if (!M2[v])
            {
                M1[nod]=v;
                M2[v]=nod;
                return 1;
            }
    }

    for (i=0; i<a[nod].size(); ++i)
    {
        v=a[nod][i];
        if (cupleaza(M2[v]))
        {
            M1[nod]=v;
            M2[v]=nod;
            return 1;
        }
    }

    return 0;
}

void Solve()
{
    int posibil=1, i;

    while (posibil)
    {
        posibil=0;

        for (i=1; i<=nL; ++i) vz[i]=0;

        for (i=1; i<=nL; ++i)
            if (!M1[i]) posibil|=cupleaza(i);
    }
}

void Scrie()
{
    int i, nr=0;

    for (i=1; i<=nL; ++i)
        if (M1[i]) ++nr;

    g<<nr<<"\n";
    for (i=1; i<=nL; ++i)
        if (M1[i]) g<<i<<" "<<M1[i]<<"\n";
}

int main()
{
    Citeste();

    Solve();

    Scrie();

    f.close();
    g.close();
    return 0;
}