Cod sursa(job #1606786)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 20 februarie 2016 15:49:02
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>

using namespace std;

ifstream in("cuplaj.in");
ofstream out("cuplaj.out");

const int N = 10010;

bool vis[N];
int _left[N], _right[N];
vector < int > adj[N];

bool pair_up(int u) {
    if(vis[u]) return 0;
    vis[u] = 1;

    for(auto i : adj[u]) {
        if(!_right[i]) {
            _left[u] = i;
            _right[i] = u;
            return 1;
        }
    }
    for(auto i : adj[u]) {
        if(pair_up(_right[i])) {
            _left[u] = i;
            _right[i] = u;
            return 1;
        }
    }
    return 0;
}

int main() {
    int n, m, e, i, u, v, match;
    bool cont;

    in >> n >> m >> e;
    for(i = 1; i <= e; i++) {
        in >> u >> v;
        adj[u].push_back(v);
    }

    match = 0;
    do {
        cont = 0;
        memset(vis, 0, sizeof(vis));
        for(i = 1; i <= n; i++) {
            if(!_left[i] && pair_up(i)) {
                match++;
                cont = 1;
            }
        }
    } while(cont);

    out << match << '\n';
    for(i = 1; i <= n; i++) {
        if(_left[i]) {
            out << i << ' ' << _left[i] << '\n';
        }
    }

    return 0;
}