Pagini recente » Cod sursa (job #1062568) | Cod sursa (job #1882974) | Cod sursa (job #2095353) | Cod sursa (job #2221083) | Cod sursa (job #481421)
Cod sursa(job #481421)
#include <cstdio>
#include <cstring>
#include <vector>
#define nmax 8195
using namespace std;
int n, m, a [nmax], b [nmax];
bool v [nmax], s [2*nmax];
vector <int> g [nmax];
bool pairup (int k)
{
v [k]=true;
vector <int> :: iterator i;
for (i=g [k].begin (); i != g [k].end (); ++i)
if (a [*i] == 0)
{
a [*i]=k;
b [k]=*i;
return true;
}
for (i=g [k].begin (); i != g [k].end (); ++i)
if (v [*i] == false && pairup (a [*i]))
{
a [*i]=k;
b [k]=*i;
return true;
}
return false;
}
int cuplaj ()
{
bool ok=true;
int i, r=0;
while (ok)
{
ok=false;
memset (v, 0, sizeof (v));
for (i=1; i <= n; ++i)
if (b [i] == 0 && pairup (i)) ok=true;
}
for (i=1; i <= n; ++i)
if (a [i]) ++r;
return r;
}
void calculeaza (int k)
{
vector <int> :: iterator i;
for (i=g [k].begin (); i != g [k].end (); ++i)
if (s [*i+n] == false)
{
s [*i+n]=true;
s [a [*i]]=false;
calculeaza (a [*i]);
}
}
void suport ()
{
int i;
for (i=1; i <= n; ++i)
if (b [i]) s [i]=true;
for (i=1; i <= n; ++i)
if (s [i] == false) calculeaza (i);
}
void print ()
{
int i;
for (i=1; i <= n; ++i)
{
if (s [i] == true && s [i+n] == true) printf ("0\n");
if (s [i] == false && s [i+n] == true) printf ("1\n");
if (s [i] == true && s [i+n] == false) printf ("2\n");
if (s [i] == false && s [i+n] == false) printf ("3\n");
}
}
int main ()
{
freopen ("felinare.in", "r", stdin);
freopen ("felinare.out", "w", stdout);
int i, x, y;
scanf ("%d%d", &n, &m);
for (i=1; i <= m; ++i)
{
scanf ("%d%d", &x, &y);
g [x].push_back (y);
}
printf ("%d\n", 2*n-cuplaj ());
suport ();
print ();
return 0;
}