Cod sursa(job #1446360)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 1 iunie 2015 17:08:21
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include<stdio.h>
#include<string.h>
#include<vector>

#define NMAX 10007

#define FORIT(it, v) for(vector<int>::iterator it = (v).begin(); it != (v).end(); ++ it)

using namespace std;

vector<int> v[NMAX];
int Dr[NMAX], St[NMAX], Viz[NMAX];
int n, m, e, x, y;

int cuplaj(int Nod){
    if(Viz[Nod] == 1)
        return 0;
    Viz[Nod] = 1;
    FORIT(it, v[Nod])
        if(! Dr[*it]){
            St[Nod] = *it;
            Dr[*it] = Nod;
            return 1;
        }
    FORIT(it, v[Nod])
        if(cuplaj(Dr[*it])){
            St[Nod] = *it;
            Dr[*it] = Nod;
            return 1;
        }
    return 0;
}

int main(){
    freopen("cuplaj.in", "r", stdin);
    freopen("cuplaj.out", "w", stdout);
    scanf("%d %d %d", &n, &m, &e);
    for(int i = 1; i <= e; ++ i){
        scanf("%d %d", &x, &y);
        v[x].push_back(y);
    }
    int cont = 1;
    while(cont){
        cont = 0;
        memset(Viz, 0, sizeof(Viz));
        for(int i = 1; i <= n; ++ i)
            if(! St[i] && cuplaj(i))
                cont = 1;
    }
    int cup = 0;
    for(int i = 1; i <= n; ++ i)
        if(St[i])
            ++ cup;
    printf("%d\n", cup);
    for(int i = 1; i <= n; ++ i)
        if(St[i])
            printf("%d %d\n", i, St[i]);
    return 0;
}