Pagini recente » Cod sursa (job #2640001) | Cod sursa (job #1139217) | Cod sursa (job #353839) | Cod sursa (job #1418260) | Cod sursa (job #399104)
Cod sursa(job #399104)
#include <cstdio>
#include <vector>
using namespace std;
#define Nmax 8200
int n, m;
int viz[Nmax], L[Nmax], R[Nmax], Sl[Nmax], Sr[Nmax];
vector <int> G[Nmax];
void citire (), afisare ();
int cuplaj (int nod) {
if (viz[nod]) return 0;
viz[nod] = 1;
int i;
for (i = 0; i < (int) G[nod].size (); i++)
if (!R[ G[nod][i] ]) {
R[ G[nod][i] ] = nod;
L[nod] = G[nod][i];
return 1;
}
for (i = 0; i < (int) G[nod].size (); i++)
if (R[ G[nod][i] ] && cuplaj ( R[G[nod][i]] )) {
R[ G[nod][i] ] = nod;
L[nod] = G[nod][i];
return 1;
}
return 0;
}
void suport_minim (int nod) {
int i;
for (i = 0; i < (int)G[nod].size (); i++) {
if (!Sr[ G[nod][i] ]) {
Sr[ G[nod][i] ] = 1; Sl[ R[G[nod][i]] ] = 0;
suport_minim ( R[G[nod][i]] );
}
}
}
int main () {
freopen ("felinare.in", "r", stdin);
freopen ("felinare.out", "w", stdout);
citire ();
int i;
for (int ok = 1; ok;) {
ok = 0; memset (viz, 0, sizeof (viz));
for (i = 1; i <= n; i++)
if (!L[i] && cuplaj (i)) ok = 1;
}
int C = 0;
for (i = 1; i <= n; i++)
if (L[i]) C++;
printf ("%d\n", (n << 1) - C);
for (i = 1; i <= n; i++)
if (L[i]) Sl[i] = 1;
for (i = 1; i <= n; i++)
if (!L[i]) suport_minim (i);
afisare ();
return 0;
}
void citire () {
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);
}
}
void afisare () {
for (int i = 1; i <= n; i++) {
if (Sl[i] && Sr[i]) printf ("%d\n", 0);
if (!Sl[i] && Sr[i]) printf ("%d\n", 1);
if (Sl[i] && !Sr[i]) printf ("%d\n", 2);
if (!Sl[i] && !Sr[i]) printf ("%d\n", 3);
}
}