Cod sursa(job #1244231)

Utilizator geniucosOncescu Costin geniucos Data 16 octombrie 2014 22:10:48
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<cstdio>
#include<vector>

using namespace std;

int n, m, K, st[10009], dr[10009], C[10009];

vector < int > v[10009];

bool cupl (int nod)
{
    if (C[nod]) return 0;
    C[nod] = 1;
    for (vector < int > :: iterator it = v[nod].begin(); it != v[nod].end(); it ++)
        if ( st[*it] == 0 )
        {
            st[*it] = nod;
            dr[nod] = *it;
            return 1;
        }
    for (vector < int > :: iterator it = v[nod].begin(); it != v[nod].end(); it ++)
        if ( st[*it] != 0 && cupl (st[*it]) )
        {
            st[*it] = nod;
            dr[nod] = *it;
            return 1;
        }
    return 0;
}

int main()
{
freopen ("cuplaj.in", "r", stdin);
freopen ("cuplaj.out", "w", stdout);
scanf ("%d %d %d", &n, &m, &K);
for (int i=1; i<=K; i++)
{
    int X, Y;
    scanf ("%d %d", &X, &Y);
    v[X].push_back(Y);
}
int cup = 1;
while (cup)
{
    cup = 0;
    for (int i=1; i<=n; i++)
        C[i] = 0;
    for (int i=1; i<=n; i++)
        if (dr[i] == 0) cup += cupl (i);
}
cup = 0;
for (int i=1; i<=n; i++)
    if (dr[i]) cup ++;
printf ("%d\n", cup);
for (int i=1; i<=n; i++)
    if (dr[i]) printf ("%d %d\n", i, dr[i]);
return 0;
}