Cod sursa(job #1391327)

Utilizator serban_ioan97Ciofu Serban serban_ioan97 Data 17 martie 2015 20:39:53
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>
#include <vector>
#include <cstring>
#define pb push_back
#define nmax 10010

using namespace std;

vector<int> a[nmax];
bool used[nmax];
int n, m, edges, cuplaj, change, x, y, l[nmax], r[nmax], i;

inline int mp(int x)
{
    if(used[x]) return 0;
    used[x]=true;
    vector<int>::iterator it;

    for(it=a[x].begin(); it!=a[x].end(); ++it)
    if(!r[*it])
    {
        l[x]=*it;
        r[*it]=x;
        return 1;
    }
    for(it=a[x].begin(); it!=a[x].end(); ++it)
    if(mp(r[*it]))
    {
        l[x]=*it;
        r[*it]=x;
        return 1;
    }
    return 0;
}

int main()
{
    freopen("cuplaj.in", "rt", stdin);
    freopen("cuplaj.out", "wt", stdout);

    scanf("%d%d%d", &n, &m, &edges);

    for(i=1; i<=edges; ++i)
    {
        scanf("%d%d", &x, &y);
        a[x].pb(y);
    }

    for(change=1; change; )
    {
        change=0;
        memset(used, false, sizeof(used));

        for(i=1; i<=n; ++i)
            if(!l[i]) change|=mp(i);
    }

    for(i=1; i<=n; ++i) cuplaj+=(l[i]>0);
    printf("%d\n", cuplaj);

    for(i=1; i<=n; ++i)
        if(l[i]>0) printf("%d %d\n", i, l[i]);

    return 0;
}