Pagini recente » Cod sursa (job #317499) | Cod sursa (job #2634405) | Cod sursa (job #2692224) | Cod sursa (job #2603341) | Cod sursa (job #881942)
Cod sursa(job #881942)
#include <cstdio>
#include <vector>
#include <cstring>
#define NMax 8500
using namespace std;
vector <int> G[NMax];
int N, L[NMax], R[NMax], C;
bool Used[NMax], UsedL[NMax], UsedR[NMax];
void Read ()
{
freopen ("felinare.in", "r", stdin);
int M;
scanf ("%d %d", &N, &M);
for (; M>0; --M)
{
int X, Y;
scanf ("%d %d", &X, &Y);
G[X].push_back (Y);
}
}
inline bool PairUp (int X)
{
if (Used[X])
{
return false;
}
Used[X]=true;
for (vector <int> :: iterator Y=G[X].begin (); Y!=G[X].end (); ++Y)
{
if (L[*Y]==0 or PairUp (L[*Y]))
{
L[*Y]=X, R[X]=*Y, UsedL[X]=true;
return true;
}
}
return false;
}
void Cuplaj ()
{
for (bool Change=true; Change; )
{
Change=false;
memset (Used, 0, sizeof (Used));
for (int i=1; i<=N; ++i)
{
if (R[i]==0)
{
Change|=PairUp (i);
}
}
}
for (int i=1; i<=N; ++i)
{
if (L[i]>0)
{
++C;
}
}
}
inline bool SPairUp (int X)
{
for (vector <int> :: iterator Y=G[X].begin (); Y!=G[X].end (); ++Y)
{
if (!UsedR[*Y])
{
UsedR[*Y]=true, UsedL[L[*Y]]=false;
SPairUp (L[*Y]);
}
}
}
void Support ()
{
for (int i=1; i<=N; ++i)
{
if (!UsedL[i])
{
SPairUp (i);
}
}
}
void Solve ()
{
Cuplaj ();
Support ();
}
void Print ()
{
freopen ("felinare.out", "w", stdout);
printf ("%d\n", 2*N-C);
for (int i=1; i<=N; ++i)
{
printf ("%d\n", 1^UsedL[i]+2*(1^UsedR[i]));
}
}
int main()
{
Read ();
Solve ();
Print ();
return 0;
}