Pagini recente » Cod sursa (job #892234) | Cod sursa (job #2178550) | Cod sursa (job #249084) | Cod sursa (job #1944609) | Cod sursa (job #2831070)
#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;
}