Cod sursa(job #2832843)

Utilizator SergiuS3003Sergiu Stancu Nicolae SergiuS3003 Data 14 ianuarie 2022 13:50:11
Problema Felinare Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#define nl '\n'
#define pb push_back
using namespace std;
ifstream f ( "felinare.in" );
ofstream g ( "felinare.out" );
const int NMAX = 16400;
bool felinare[NMAX];
bool viz[NMAX];
int l[NMAX], r[NMAX], N;
vector<int>G[NMAX];
bool pairup ( int x )
{
    if ( viz[x] )
        return 0;

    viz[x] = 1;

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

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

    return 0;
}
int main()
{
    int M;
    f >> N >> M;

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

    int nrfelinare = 2 * N;
    bool ok = 1;

    while ( ok )
    {
        ok = 0;

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

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

    for ( int i = 1; i <= N; i++ )
        if ( l[i] )
            nrfelinare--;

    g << nrfelinare << nl;
    return 0;
}