Cod sursa(job #1812460)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 22 noiembrie 2016 09:34:54
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <cstdio>
#include <vector>
#include <cstring>
#define Nmax 10000

using namespace std;

ofstream g("cuplaj.out");

vector<int> G[Nmax+1];

int n,m,e,x,y,l[Nmax+1],r[Nmax+1];
bool uz[Nmax+1],change;

bool cup(int nod)
{
    uz[nod]=1;
    for (int i=0;i<G[nod].size();i++)
    {
        int crt = G[nod][i];
        if (!r[crt])
        {
            l[nod] = crt;
            r[crt] = nod;
            return true;
        }
    }

    for (int i=0;i<G[nod].size();i++)
    {
        int crt = G[nod][i];
        if (!uz[r[crt]] && cup(r[crt]))
        {
            r[crt] = nod;
            l[nod] = crt;
            return 1;
        }
    }

    return false;
}

int main()
{
    freopen("cuplaj.in","r",stdin);

    scanf("%ld%ld%ld",&n,&m,&e);
    for (int i=1;i<=e;i++)
    {
        scanf("%ld%ld",&x,&y);
        G[x].push_back(y);
    }

    do
    {
        change = false;
        memset(uz,0,sizeof(uz));

        for (int i=1;i<=n;i++)
        {
            if (!l[i])
               change |= cup(i);
        }
    }
    while (change);

    int nr=0;
    for (int i=1;i<=n;i++)
        nr += l[i]!=0;

    g<<nr<<'\n';

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


    return 0;
}