Cod sursa(job #931636)

Utilizator cernat.catallinFMI Cernat Catalin Stefan cernat.catallin Data 28 martie 2013 13:27:52
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;

#define Nmax 20005

vector <int> graf[Nmax];
int n, m, e, maxC;
int st[Nmax], dr[Nmax], used[Nmax];

void read(){
    int u, v;
    scanf("%i %i %i", &n, &m, &e);
    for(int i = 1; i <= e; ++i){
        scanf("%i %i", &u, &v);
        graf[u].push_back(v);
    }
    fclose(stdin);
}

int cupleaza(int node){
    int v;
    if(used[node]) return 0;
    used[node] = 1;
    for(int i = 0, size = graf[node].size(); i < size; ++i){
        v = graf[node][i];
        if(!dr[v] || cupleaza(dr[v])){
            st[node] = v;
            dr[v] = node;
            return 1;
        }
    }
    return 0;
}

void solve(){
    for(int i = 1; i <= n; ++i){
        if(st[i]) continue;
        if(cupleaza(i)) ++maxC;
        else{
            memset(used, 0, sizeof(used));
            if(cupleaza(i)) ++maxC;
        }
    }
}

void write(){
    printf("%i\n", maxC);
    for(int i = 1; i <= n; ++i)
        if(st[i])
            printf("%i %i\n", i, st[i]);
    fclose(stdout);
}

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

    return 0;
}