Cod sursa(job #492279)

Utilizator MariusMarius Stroe Marius Data 14 octombrie 2010 01:33:37
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

const char iname[] = "cuplaj.in";
const char oname[] = "cuplaj.out";

const int MAX_N = 10005;

vector <int> adj[MAX_N], l, r, u;

int pairup(const int n) {
    if (u[n])  return 0;
    vector <int>::iterator it;
    u[n] = true;
    for (it = adj[n].begin(); it != adj[n].end(); ++ it) {
        if (!r[*it] || pairup(r[*it])) {
            l[n] = *it, r[*it] = n;
            return 1;
        }
    }
    return 0;
}

int main(void) {
    int n, m, edges, x, y;

    ifstream in(iname);
    in >> n >> m >> edges;
    while (edges --) {
        in >> x >> y;
        adj[x].push_back(y);
    }
    in.close();

    l.resize(n + 1), l.assign(l.size(), 0);
    r.resize(m + 1), r.assign(r.size(), 0);
    u.resize(n + 1), u.assign(u.size(), 0);
    for (int change = 1; change; ) {
        change = 0;
        u.assign(u.size(), 0);
        for (int i = 1; i <= n; ++ i) if (!l[i])
            change += pairup(i);
    }
    ofstream out(oname);
    int answer = 0;
    for (int i = 1; i <= n; ++ i) if (l[i])
        answer ++;
    out << answer << "\n";
    for (int i = 1; i <= n; ++ i) if (l[i])
        out << i << " " << l[i] << '\n';
    out.close();

    return 0;
}