Cod sursa(job #313249)

Utilizator vlad_popaVlad Popa vlad_popa Data 8 mai 2009 14:46:53
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <cstdio>
#include <vector>

#define MAXN 10005
#define pb push_back

using namespace std;

vector <int> lv[MAXN];
int N, M, E;
int d[MAXN], p[MAXN];
int iter, viz[MAXN];

void read () {
    int x, y;
    
    for (scanf ("%d %d %d", &N, &M, &E); E; -- E) {
        scanf (" %d %d", &x, &y);
        lv[x].pb(y);
    }
}

int cuplaj (int nod) {
    int sz = lv[nod].size();
    viz[nod] = iter;
    
    for (int i = 0; i < sz; ++ i)
        if (!d[lv[nod][i]]) {
            d[lv[nod][i]] = nod;
            p[nod] = lv[nod][i];
            return 1;
        }
        
    for (int i = 0; i < sz; ++ i)
        if (viz[d[lv[nod][i]]] != iter && cuplaj(d[lv[nod][i]])) {
            d[lv[nod][i]] = nod;
            p[nod] = lv[nod][i];
            return 1;
        }
        
    return 0;
}

void solve () {
    bool ok = false;
    int i;
    
    while (!ok) {
        ok = true;
        ++ iter;
        
        for (i = 1; i <= N; ++ i)
            if (!p[i] && cuplaj(i)) {
                ok = false;
                ++ iter;
            }
    }
    
    int sol = 0;
    for (i = 1; i <= N; ++ i)
        if (p[i]) ++ sol;
        
    printf ("%d\n", sol);
    for (i = 1; i <= N; ++ i)
        if (p[i]) printf ("%d %d\n", i, p[i]);
}

int main () {
    freopen ("cuplaj.in", "r", stdin);
    freopen ("cuplaj.out", "w", stdout);
    
    read ();
    solve ();
    
    return 0;
}