Cod sursa(job #1164363)

Utilizator SRaduRadu Szasz SRadu Data 2 aprilie 2014 00:14:31
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

const int MAX = 10500;

int N, M, E;
int L[MAX], R[MAX];

bool used[MAX];

vector<int> G[MAX];

void citire() {
    ifstream in("cuplaj.in");
    in >> N >> M >> E;
    for(int i = 1, A, B; i <= E; i++) {
        in >> A >> B;
        G[A].push_back(B);
    } in.close();
}

bool pairUp(int nod) {
    if(used[nod]) 
        return false;
    used[nod] = true;
    for(size_t i = 0; i < G[nod].size(); i++) {
        int dest = G[nod][i];
        if(!R[dest]) {
            L[nod] = dest;
            R[dest] = nod;
            return true;
        }
    }
    for(size_t i = 0; i < G[nod].size(); i++) {
        int dest = G[nod][i];
        if(pairUp(R[dest])) {
            L[nod] = dest;
            R[dest] = nod;
            return true;
        }
    } return false;
}

void afisare() {
    ofstream out("cuplaj.out");
    int Ans = 0;
    for(int i = 1; i <= N; i++)
        Ans += (L[i] != 0);
    out << Ans << "\n";

    for(int i = 1; i <= N; i++) {
        if(L[i])
            out << i << " " << L[i] << "\n";
    }
}

int main() {
    citire();

    for(int change = 1; change; ) {
        change = 0;
        memset(used, 0, sizeof(used));
        for(int i = 1; i <= N; i++) {
            if(!L[i])
                change |= pairUp(i);
        }
    }

    afisare();
}