Cod sursa(job #2828678)

Utilizator SergiuS3003Sergiu Stancu Nicolae SergiuS3003 Data 7 ianuarie 2022 19:44:29
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <vector>
#define pb push_back
#define nl '\n'
#define mp make_pair
#define fi first
#define se second
using namespace std;
ifstream f ( "cuplaj.in" );
ofstream g ( "cuplaj.out" );
const int NMAX = 10002;
bool viz[NMAX];
vector<int>G[NMAX];
int l[NMAX], r[NMAX];
bool pairup ( int x )
{
    //cout<<x<<nl;
    if ( viz[x] )
        return 0;

    viz[x] = 1;

    for ( auto i : G[x] )
        if ( r[i] == 0 )
        {
            r[i] = x;
            l[x] = i;
            return 1;
        }

    for ( auto i : G[x] )
        if ( pairup ( r[i] ) )
        {
            r[i] = x;
            l[x] = i;
            return 1;
        }

    return 0;
}
vector<pair<int, int>>ans;
int main()
{
    int N, M, E;
    f >> N >> M >> E;

    for ( int i = 1; i <= E; i++ )
    {
        int x, y;
        f >> x >> y;
        G[x].pb ( y );
    }

    bool ok = 1;

    for ( ok; ok != 0; )
    {
        ok = 0;

        for ( int i = 1; i <= N; i++ )
            viz[i] = 0;

        for ( int i = 1; i <= N; i++ )
            if ( l[i] == 0 )
            {
                ok = ok | pairup ( i );
                //cout<<nl;
            }

        //cout<<2222222<<nl;
    }

    for ( int i = 1; i <= N; i++ )
        if ( l[i] )
            ans.pb ( mp ( i, l[i] ) );

    g << ans.size() << nl;

    for ( auto i : ans )
        g << i.fi << ' ' << i.se << nl;

    return 0;
}