Cod sursa(job #1688293)

Utilizator lupvasileLup Vasile lupvasile Data 13 aprilie 2016 13:19:54
Problema Cuplaj maxim in graf bipartit Scor 24
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>
using namespace std;
#ifdef INFOARENA
#define cout fout
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
#else
ifstream fin("date.in");
#endif // INFOARENA

/// ///////////////////////////////////////////

void read();

#define nmax 10010

bool open[nmax];
vector<int> G[nmax];
int L[nmax],R[nmax],n,m;

bool match(int nod)
{
    if(open[nod]) return 0;

    open[nod]=true;

    for(auto vec:G[nod])
        if(!L[vec])
    {
        L[vec]=nod;
        R[nod]=vec;
        open[nod]=false;
        return 1;
    }

    for(auto vec:G[nod])
    {
        if(match(vec))
        {
        L[vec]=nod;
        R[nod]=vec;
        open[nod]=false;
        return 1;
        }
    }

    return 0;
}

int main()
{
    read();

    int i,nr(0);

    for(i=1;i<=n;++i)
        if(!R[i]) match(i);

    for(i=1;i<=n;++i) if(R[i]) ++nr;
    cout<<nr<<'\n';
    for(i=1;i<=n;++i) if(R[i]) cout<<i<<' '<<R[i]<<'\n';

    return 0;
}
void read()
{
    int e,x,y;
    fin>>n>>m>>e;
    for(;e;--e)
    {
        fin>>x>>y;
        G[x].push_back(y);
    }
}