Pagini recente » Istoria paginii utilizator/waizdor | Cod sursa (job #1557791) | Statistici Roberta Gabriela (rober_gaby) | Cod sursa (job #396380) | Cod sursa (job #73540)
Cod sursa(job #73540)
using namespace std;
#include <cstdio>
#include <cassert>
#include <cstring>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#define FIN "felinare.in"
#define FOUT "felinare.out"
#define NMAX 8192
#define PB push_back
int N, M, viz[NMAX], d[NMAX], con[NMAX], iter, Cs[NMAX], Cd[NMAX], Match, Matched[NMAX];
vector <int> A[NMAX];
void read ()
{
scanf ("%d %d\n", &N, &M);
int x, y;
for (int i = 0; i < M; ++ i)
{
scanf ("%d %d\n", &x, &y);
A[x].PB (y);
}
}
int DFS (int nod)
{
if (viz[nod] == iter)
return 0;
viz[nod] = iter;
for (vector <int> :: iterator it = A[nod].begin(); it != A[nod].end(); ++ it)
if (d[*it] == -1)
{
d[*it] = nod;
Matched[nod] = 1;
return 1;
}
else
{
int rez = DFS (d[*it]);
if (rez)
{
d[*it] = nod;
Matched[nod] = 1;
return 1;
}
}
return 0;
}
void FindAlter (int nod)
{
if (viz[nod] == iter)
return;
viz[nod] = iter;
Cs[nod] = 0;
for (vector <int> :: iterator it = A[nod].begin(); it != A[nod].end(); ++ it)
if (d[*it] != -1)
{
Cd[nod] = 1;
FindAlter (d[*it]);
}
}
void solve ()
{
for (int i = 1; i <= N; ++ i)
{
d[i] = -1;
++ Cs[i];
}
int verif = 1;
while (verif)
{
verif = 0;
for (int i = 1; i <= N; ++ i)
if (!con[i])
{
++ iter;
DFS (i);
verif = con[i] = 1;
}
}
for (int i = 1; i <= N; ++ i)
if (d[i] != -1)
{
//fprintf (stderr, "%d %d\n", d[i], i);
++ Match;
}
for (int i = 1; i <= N; ++ i)
if (!Matched[i])
{
++ iter;
FindAlter (i);
}
printf ("%d\n", 2*N - Match);
for (int i = 1; i <= N; ++ i)
printf ("%d\n", 1 - Cs[i] + 2 * (1 - Cd[i]));
}
int
main ()
{
freopen (FIN, "rt", stdin);
freopen (FOUT, "wt", stdout);
read ();
solve ();
return 0;
}