Cod sursa(job #1850093)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 18 ianuarie 2017 10:22:17
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#include <vector>
#include <cstring>
#define Nmax 10001
using namespace std;

ofstream g("cuplaj.out");

int n,m,e,S[Nmax],nr,D[Nmax];
bool uz[Nmax];
vector<int> V[Nmax];

bool cup(int nod)
{
    uz[nod]  = 1;
    for (int i=0;i<V[nod].size();i++)
    {
        if (!D[V[nod][i]])
        {
            S[nod] = V[nod][i];
            D[V[nod][i]] = nod;
            nr++;
            return 1;
        }
    }
    for (int i=0;i<V[nod].size();i++)
    {
        if(!uz[D[V[nod][i]]] && cup(D[V[nod][i]]))
        {
            S[nod] = V[nod][i];
            D[V[nod][i]] = nod;
            return 1;
        }
    }
    return 0;
}

int main()
{
    freopen("cuplaj.in","r",stdin);
    scanf("%ld%ld%ld",&n,&m,&e);

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

    bool ok = 1;
    while (ok)
    {
        ok = 0;
        memset(uz,0,sizeof(uz));
        for (int i=1;i<=n;i++)
        {
            if (!uz[i] && !S[i])
                ok |= cup(i);
        }
    }

    g<<nr<<'\n';
    for (int i=1;i<=n;i++)
    {
        if (S[i])
            g<<i<<' '<<S[i]<<'\n';
    }

    return 0;
}