Cod sursa(job #988367)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 22 august 2013 18:11:56
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
#include <vector>

#include <cstring>
using namespace std;

const int MAX_N = 10002;

int N1, N2, M, sol;
int L[MAX_N], R[MAX_N];
vector < int > v[MAX_N];
bool used[MAX_N];

inline bool pair_up(int x) {
    if(used[x])
        return 0;
    used[x] = 1;
    for(size_t i = 0; i < v[x].size(); ++i) {
        int y  = v[x][i];
        if(!R[y] || pair_up(R[y])) {
            L[x] = y;
            R[y] = x;
            return 1;
        }
    }
    return 0;
}


int main() {
    ifstream f("cuplaj.in");
    ofstream g("cuplaj.out");

    f >> N1 >> N2 >> M;
    for(int i = 1, x, y; i <= M; ++i) {
        f >> x >> y;
        v[x].push_back(y);
    }

    int ok = 1;
    while(ok) {
        memset(used, 0, sizeof(used));
        ok = 0;
        for(int i = 1; i <= N1; ++i)
            if(!L[i] && pair_up(i))
                ++sol, ok = 1;
    }

    g << sol << "\n";
    for(int i = 1; i <= N1; ++i)
        if(L[i])
            g << i << " " << L[i] << "\n";

    f.close();
    g.close();

    return 0;
}