Cod sursa(job #2745122)

Utilizator SergiuS3003Sergiu Stancu Nicolae SergiuS3003 Data 25 aprilie 2021 21:53:00
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>
#define pb push_back
#define nl '\n'
#define mp make_pair
using namespace std;
ifstream f ( "cuplaj.in" );
ofstream g ( "cuplaj.out" );
const int NMAX = 10001;
vector<int>G[NMAX];
int l[NMAX], r[NMAX], viz[NMAX];
int pairup ( int x )
{
    if ( viz[x] )
        return 0;

    viz[x] = 1;

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

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

    return 0;
}
int main()
{
    int N1, N2, M;
    f >> N1 >> N2 >> M;

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

    for ( int mutare = 1; mutare != 0; )
    {
        mutare = 0;
        memset ( viz, 0, sizeof ( viz ) );

        for ( int i = 1; i <= N1; i++ )
            if ( l[i] == 0 )
                mutare = mutare | pairup ( i );
    }

    vector<pair<int, int>>ans;

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

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

    for ( auto i : ans )
        g << i.first << ' ' << i.second << nl;

    return 0;
}