Cod sursa(job #2831070)

Utilizator SergiuS3003Sergiu Stancu Nicolae SergiuS3003 Data 10 ianuarie 2022 20:09:25
Problema Felinare Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 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;
set<int>grade[NMAX];
vector<int>G[NMAX];
int grad[NMAX];
bool felinare[NMAX];
int main()
{
    int N, 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;
    int grmx = 0;

    for ( int i = 1; i <= 2 * N; i++ )
    {
        felinare[i] = 1;
        grade[grad[i]].insert ( i );
        grmx = max ( grmx, grad[i] );
    }

    for ( int gr = grmx; gr >= 1; gr-- )
    {
        while ( !grade[gr].empty() )
        {
            int node = *grade[gr].begin();
            grad[node] = 0;
            grade[gr].erase ( node );
            felinare[node] = 0;
            nrfelinare--;

            for ( auto vecin : G[node] )
            {
                //cout<<vecin<<' ';
                grad[vecin]--;
                int gradv = grad[vecin];
                //cout<<gradv<<nl;
                grade[gradv + 1].erase ( vecin );

                if ( gradv > 0 )
                {
                    grade[gradv].insert ( vecin );
                }
            }

            //cout<<nl;
        }
    }

    g << nrfelinare << nl;

    for ( int i = 1; i <= N; i++ )
    {
        int nrcrt = 0;
        nrcrt += felinare[i] + 2 * felinare[i + N];
        g << nrcrt << nl;
    }

    return 0;
}