Cod sursa(job #2031153)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 2 octombrie 2017 19:36:42
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <bits/stdc++.h>
#define Nmax 10001
using namespace std;

int n,m,e,x,y,dr[Nmax],st[Nmax],viz[Nmax],nr,rez;
vector<int> V[Nmax];

bool cup(int nod)
{
    viz[nod] = nr;
    for (auto it : V[nod])
    {
        if (!dr[it])
        {
            dr[it] = nod;
            st[nod] = it;
            return true;
        }
    }
    for (auto it : V[nod])
    {
        if (viz[dr[it]]!=nr && cup(dr[it]))
        {
            dr[it] = nod;
            st[nod] = it;
            return true;
        }
    }
    return false;
}

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


    cin>>n>>m>>e;
    for (int i=1;i<=e;i++)
    {
        cin>>x>>y;
        V[x].push_back(y);
    }

    int ok;
    do
    {
        ok = 0;
        nr++;
        for (int i=1;i<=n;i++)
            if (!st[i] && viz[i]!=nr)
                ok |= cup(i);
    }while (ok);

    for (int i=1;i<=n;i++) if (st[i]) rez++; cout<<rez<<'\n';
    for (int i=1;i<=n;i++) if (st[i]) cout<<i<<' '<<st[i]<<'\n';

    return 0;
}