Cod sursa(job #988365)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 22 august 2013 18:08:44
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 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;
            used[x] = 0;
            return 1;
        }
    }
    used[x] = 0;
    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);
    }

    for(int i = 1; i <= N1; ++i)
        if(!L[i]) {
            if(pair_up(i))
                ++sol;
            else {
                if(pair_up(i))
                    ++sol;
            }
        }

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

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

    return 0;
}