Cod sursa(job #1422908)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 20 aprilie 2015 11:11:52
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
//#include <iostream>
#include <fstream>
using namespace std;

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

#include <vector>
#define pb push_back
#define LE 10666

vector<int> H[LE];

bool viz[LE];
int l[LE],r[LE];


bool pair_up(int nod)
{
    viz[nod]=true;
    int N=H[nod].size(),i;

    for(i=0; i<N; ++i)
    {
        int D=H[nod][i];

        if (l[D]==0)
        {
            l[D]=nod;
            r[nod]=D;
            return true;
        }

        if (viz[l[D]]==false)
            if (pair_up(l[D])==true)
            {
                l[D]=nod;
                r[nod]=D;
                return true;
            }
    }

    return false;
}

int main()
{
    int n1,n2,m,i;

    f>>n1>>n2>>m;

    for(i=1; i<=m; ++i)
    {
        int xx,yy;
        f>>xx>>yy;
        H[xx].pb(yy);
    }

    while (true)
    {
        bool okz=false;
        for(i=1; i<=n1; ++i) viz[i]=false;

        for(i=1; i<=n1; ++i)
          if (r[i]==0)
            if (viz[i]==false)
                okz|=pair_up(i);

        if (okz==false) break;
    }

    int nr_sol=0;

    for(i=1; i<=n2; ++i)
        if (l[i]!=0)
            ++nr_sol;

    g<<nr_sol<<'\n';

    for(i=1; i<=n2; ++i)
        if (l[i]!=0)
            g<<l[i]<<" "<<i<<'\n';

    return 0;
}