Cod sursa(job #723523)

Utilizator Sm3USmeu Rares Sm3U Data 25 martie 2012 16:01:40
Problema Cuplaj maxim in graf bipartit Scor 24
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <cstdio>
#include <vector>
#include <cstring>

#define nMax 10010

using namespace std;

int n;
vector <int> graf[nMax];
int catre[nMax];
int deLa[nMax];
bool verificat[nMax];

void citire (){
    int m;
    scanf ("%d %d %d", &n, &m, &m);
    while (m --){
        int x;
        int y;
        scanf ("%d %d", &x, &y);
        graf[x].push_back (y);
    }
}

int cuplaj (int i){
    if (verificat[i]){
        return 0;
    }
    verificat[i] = 1;
    for (int j = 0; j < graf[i].size(); ++ j){
        if (!deLa[graf[i][j]]){
            catre[i] = graf[i][j];
            deLa[graf[i][j]] = i;
            return 1;
        }
    }
    for (int j = 0; j <graf[i].size(); ++ j){
        if (cuplaj(graf[i][j])){
            catre[i] = graf[i][j];
            deLa[graf[i][j]] = i;
            return 1;
        }
    }
    return 0;
}

void rez(){
    int ok = 1;
    while (ok){
        ok = 0;
        memset (verificat, 0, sizeof(verificat));
        for (int i = 1; i <= n; ++ i){
            if (!catre[i]){
                ok += cuplaj(i);
            }
        }
    }
    int nr = 0;
    for (int i = 1; i <= n; ++ i){
        if (catre[i]){
            nr ++;
        }
    }
    printf ("%d\n", nr);
    for (int i = 1; i <= n; ++ i){
        if (catre[i]){
            printf ("%d %d\n", i, catre[i]);
        }
    }
}

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

    citire();
    rez();

    return 0;
}