Cod sursa(job #934623)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 30 martie 2013 21:37:02
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#include <vector>
#include <cstring>

#define MAX 10005

using namespace std;

int N, M, E, L[MAX], R[MAX];
bool viz[MAX];
vector<int> V[MAX];

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

inline bool pairup(int nod) {
    if(viz[nod]) return false;
    viz[nod] = true;
    for(size_t i = 0; i < V[nod].size(); i++) {
        int dest = V[nod][i];
        if(!R[dest]) {
            L[nod] = dest;
            R[dest] = nod;
            return true;
        }
    }
    for(size_t i = 0; i < V[nod].size(); i++) {
        int dest = V[nod][i];
        if(pairup(R[dest])) {
            L[nod] = dest;
            R[dest] = nod;
            return true;
        }
    } return false;
}

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

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

int main() {
    citire();
    solve();
    afisare();
    return 0;
}