Cod sursa(job #1719048)

Utilizator cristian.caldareaCaldarea Cristian Daniel cristian.caldarea Data 19 iunie 2016 12:01:43
Problema Cuplaj maxim in graf bipartit Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;

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

const int Nmax = 10002;

int n, m, p, cuplaj;
bool e;
vector<vector<int>> G;
vector<int> L, R;
bool v[Nmax];

void Read();
int Match(int x);

int main()
{
    Read();
    do
    {
        memset(v, 0, sizeof(v));
        e = 0;
        for ( int i = 1; i <= n; ++i )
            if ( !L[i] && Match(i) )
            {
                cuplaj++;
                e = 1;
            }
    } while ( e );

    fout << cuplaj << '\n';
	for ( int i = 1; i <= n; ++i )
		if ( L[i] )
			fout << i << ' ' << L[i] << '\n';
    fin.close();
    fout.close();
    return 0;
}

void Read()
{
    int x, y;
    fin >> n >> m >> p;

    G = vector<vector<int>>(n+1);
    L = vector<int>(n + 1);
    R = vector<int>(m + 1);

    for ( int i = 1; i <= p; i++ )
    {
        fin >> x >> y;
        G[x].push_back(y);
    }
}
int Match(int x)
{
    if ( v[x] )
        return false;
    v[x] = 1;
    for ( auto y : G[x] )
        if ( !R[y] || Match(y) )
        {
            L[x] = y;
            R[y] = x;
            return true;
        }
    return false;
}