Cod sursa(job #1967495)

Utilizator mariakKapros Maria mariak Data 16 aprilie 2017 18:50:25
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>
#define maxN 20002

FILE *fin  = freopen("cuplaj.in", "r", stdin);
FILE *fout = freopen("cuplaj.out", "w", stdout);

using namespace std;
int N, M, E;
vector <int> G[maxN];
int Pair[maxN];
bitset <maxN> used;

bool PairUp(int node){
    if(used.test(node)) return 0;
    used.set(node);
    for(int son : G[node])
        if(!Pair[son] || PairUp(Pair[son])){
            Pair[node] = son;
            Pair[son] = node;
            return 1;
        }
    return 0;
}

int Match(){
    int card = 0;
    bool change;
    do{
        change = false;
        used.reset();
        for(int i = 1; i <= N; ++ i)
            if(!Pair[i])
                change |= PairUp(i);

    }while(change);
    for(int i = 1; i <= N; ++ i)
        if(Pair[i]) ++ card;
    return card;
}

void write(){
    printf("%d\n", Match());
    for(int i = 1; i <= N; ++ i)
        if(Pair[i])
            printf("%d %d\n", i, Pair[i] - N);
}

int main(){
    scanf("%d %d %d", &N, &M, &E);
    for(int i = 1; i <= E; ++ i){
        int x, y;
        scanf("%d %d", &x, &y);
        G[x].push_back(y + N);
        //G[y + N].push_back(x);
    }
    write();
    return 0;
}