Cod sursa(job #1246483)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 21 octombrie 2014 09:55:39
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <cstdio>
#include <vector>
#define pb push_back
#define Nmax 10010

using namespace std;

vector <int> g[Nmax];
int n,m,e,i,n1,n2,SOL,x,y;
int st[Nmax],dr[Nmax];
bool sel[Nmax];

inline bool cupleaza(int nod)
{
    if (sel[nod]) return false;
    sel[nod]=true;
    for (int i=0;i<g[nod].size();++i)
    if (!dr[g[nod][i]])
    {
        st[nod]=g[nod][i]; dr[g[nod][i]]=nod;
        return true;
    }

    for (int i=0;i<g[nod].size();++i)
    if (cupleaza(dr[g[nod][i]]))
    {
        st[nod]=g[nod][i]; dr[g[nod][i]]=nod;
        return true;
    }
    return false;
}

inline void cuplaj()
{
    bool ok=true;
    for (;ok;)
    {
        ok=false;
        for (int i=1;i<=n;++i) sel[i]=false;
        for (i=1;i<=n;++i)
        if (!st[i]) ok|=cupleaza(i);
    }
}

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

    scanf("%d %d %d", &n, &m, &e);
    for (i=1;i<=e;++i)
    {
        scanf("%d %d", &x, &y);
        g[x].pb(y);
    }

    cuplaj();
    for (i=1;i<=n;++i)
    if (st[i]) SOL++;

    printf("%d\n", SOL);
    for (i=1;i<=n;++i)
     if (st[i])
       printf("%d %d\n", i, st[i]);


    return 0;
}