Cod sursa(job #246474)

Utilizator vlad_popaVlad Popa vlad_popa Data 20 ianuarie 2009 21:54:37
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <cstdio>
#include <vector>

using namespace std;

#define MAXN 10005
#define pb push_back

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

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

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

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