Cod sursa(job #1446670)

Utilizator dinuandAndrei-Mario Dinu dinuand Data 2 iunie 2015 16:05:42
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#include <iostream>
#include <vector>

#define NMAX 10001

using namespace std;
using Graph = vector<vector<int> >;

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

Graph G(NMAX);
vector<bool> visited(NMAX);
vector<int> l(NMAX);
vector<int> r(NMAX);

bool pairup(int source)
{
    if (visited[source]) return false;
    visited[source] = true;
    for (auto &node : G[source])
        if (!r[node]) {
            l[source] = node;
            r[node] = source;
            return true; 
        }

    for (auto &node : G[source]) {
        /* Ok, r[node] is coupled, let's try coupling different way */
        if (pairup(r[node])) {
            l[source] = node;
            r[node] = source;
            return true;
        }
    }
    return false;
}

int main()
{
    int N, M, E;
    fin >> N >> M >> E;
    int x, y;

    for (int edge = 1; edge <= E; edge++) {
        fin >> x >> y;
        G[x].emplace_back(y);
    }

    int done = 0, CoupledEdges = 0;
    while (!done) {
        done = 1;
        for (auto i = 1u; i < G.size(); i++)
            if (!l[i] && pairup(i))
                CoupledEdges++, done = 0;

        for (auto i = 1u; i < G.size(); i++)
            visited[i] = false;
    }

    fout << CoupledEdges << '\n';
    for (auto i = 1u; i < G.size(); i++)
        if (l[i])
            fout << i << " " << l[i] << '\n';

    return 0;
}