Pagini recente » Cod sursa (job #2634829) | Cod sursa (job #1894225) | Cod sursa (job #1257460) | Cod sursa (job #1751390) | Cod sursa (job #1164974)
#include <cstdio>
#include <vector>
#include <cstring>
#define nmax 9000
using namespace std;
vector <int> g[nmax];
int c1[nmax],c2[nmax];
bool left[nmax],right[nmax];
bool viz[nmax];
int n,m;
int nr;
bool connect(int x) {
if (viz[x]) return false;
viz[x] = true;
for (vector <int> :: iterator it = g[x].begin();it != g[x].end();it++) {
if (c2[*it] == 0) {
c2[*it] = x;
c1[x] = *it;
left[x] = true;
return true;
}
}
for (vector <int> :: iterator it = g[x].begin();it != g[x].end();it++) {
if (connect(c2[*it])) {
c2[*it] = x;
c1[x] = *it;
left[x] = true;
return true;
}
}
return false;
}
int back(int x) {
for (vector <int> :: iterator it = g[x].begin();it != g[x].end();it++) {
if (!right[*it]) {
right[*it] = true;
left[c2[*it]] = false;
back(c2[*it]);
}
}
}
int main() {
freopen("felinare.in","r",stdin);
freopen("felinare.out","w",stdout);
scanf("%d %d",&n,&m);
nr = 2*n;
for (int i=1;i<=m;i++) {
int a,b;
scanf("%d %d",&a,&b);
g[a].push_back(b);
}
for (bool changed = true;changed;) {
changed = false;
for (int i=1;i<=n;i++) {
if (c1[i] == 0 && connect(i)) changed = true;
}
for (int i=0;i < nmax;i++) viz[i] = false;
}
for (int i=1;i<=n;i++) {
if (!left[i]) back(i);
}
for (int i=1;i<=n;i++) {
if (left[i]) nr--;
if (right[i]) nr--;
}
printf("%d\n",nr);
for (int i=1;i<=n;i++) {
int r = 3;
if (left[i]) r -= 1;
if (right[i]) r -= 2;
printf("%d\n",r);
}
return 0;
}