Cod sursa(job #1184786)

Utilizator Ionut228Ionut Calofir Ionut228 Data 14 mai 2014 08:47:35
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <cstring>
#include <vector>

using namespace std;

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

int N, M, edges;
int l[10001], r[10001], u[10001];
vector<int> V[10001];

int pairup(int nr)
{
    if (u[nr]) return 0;
    u[nr] = 1;

    for (vector<int>::iterator it = V[nr].begin(); it != V[nr].end(); ++it)
        if (!r[*it])
        {
            l[nr] = *it;
            r[*it] = nr;
            return 1;
        }

    for (vector<int>::iterator it = V[nr].begin(); it != V[nr].end(); ++it)
        if (pairup(r[*it]))
        {
            l[nr] = *it;
            r[*it] = nr;
            return 1;
        }

    return 0;
}

int main()
{
    fin >> N >> M >> edges;
    while (edges--)
    {
        int nod1, nod2;
        fin >> nod1 >> nod2;
        V[nod1].push_back(nod2);
    }

    for (int change = 1; change; )
    {
        change = 0;
        memset(u, 0, sizeof(u));
        for (int i = 1; i <= N; ++i)
            if (!l[i])
                change |= pairup(i);
    }

    int cuplaj = 0;
    for (int i = 1; i <= N; ++i)
        cuplaj += (l[i] > 0);
    fout << cuplaj << '\n';
    for (int i = 1; i <= N; ++i)
        if (l[i] > 0)
            fout << i << ' ' << l[i] << '\n';

    fin.close();
    fout.close();
    return 0;
}