Cod sursa(job #931650)

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

#define Nmax 20005

vector <int> graf[Nmax];
int n, m, e, maxC, ok;
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(){
    ok = 1;
    while(ok){
        ok = 0;
        memset(used, 0, sizeof(used));
        for(int i = 1; i <= n; ++i){
            if(!st[i])
                if(cupleaza(i)) ++maxC, ok = 1;
        }
    }
}

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;
}