Cod sursa(job #1246166)

Utilizator OnimushaLordTiberiu Copaciu OnimushaLord Data 20 octombrie 2014 18:17:15
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
# include <cstdio>
# include <vector>
# include <cstring>
# define N 10000

# define pb push_back

using namespace std;

vector <int> G[N];
vector <int> :: iterator it;
int N1,N2,nr,NR;
int U[N],st[N],dr[N];
int x,y,i;

int cupleaza(int nod)
{
    int i,I;
    if(U[nod]) return 0;
    U[nod]=1;
    for(i=0; i<G[nod].size(); ++i)
    {
        I=G[nod][i];
        if(!dr[I] || cupleaza(dr[I]))
        {
            st[nod]=I;
            dr[I]=nod;
            return 1;
        }
    }
    return 0;
}

void cuplaj()
{
    int i;
    for(i=1; i<=N1; ++i)
    {
        if(st[i]) continue;
        if(cupleaza(i)) NR++;
        else
        {
            memset(U, 0, sizeof(U));
            if(cupleaza(i)) NR++;
        }
    }
    return;
}

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

    scanf("%d %d %d\n", &N1, &N2, &nr);
    while(nr--)
    {
        scanf("%d %d\n", &x, &y);
        G[x].pb(y);
    }

    cuplaj();

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

    return 0;
}