Pagini recente » Cod sursa (job #2377202) | Cod sursa (job #2257434) | Cod sursa (job #1501127) | Cod sursa (job #2633692) | Cod sursa (job #1390961)
//#include <iostream>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <bitset>
#include <limits>
#include <fstream>
#include <cstring>
#include <iomanip>
#include <cstdlib>
#include <algorithm>
using namespace std;
ifstream cin("felinare.in");
ofstream cout("felinare.out");
#define nmax 10000
#define mod 1000007
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define inf numeric_limits<int>::max()
#define forv(v,it) for (vector<int>::iterator it=v.begin();it!=v.end();it++)
int n,m,x,y,ok,match1[nmax],match2[nmax],viz[nmax],m1[nmax],m2[nmax],rez;
vector<int> g[nmax];
int match(int nod)
{
if (viz[nod]) return 0;
viz[nod]=1;
forv(g[nod],it)
if (!match2[*it])
{
match1[nod]=*it;
match2[*it]=nod;
m1[nod]=1;
return 1;
}
forv(g[nod],it)
if (match(match2[*it]))
{
match1[nod]=*it;
match2[*it]=nod;
m1[nod]=1;
return 1;
}
return 0;
}
void check(int nod)
{
forv(g[nod],it)
if (!m2[*it])
{
m2[*it]=1;
m1[match2[*it]]=0;
check(match2[*it]);
}
}
int main()
{
int i,j;
cin>>n>>m;
for (i=1;i<=m;i++)
{
cin>>x>>y;
g[x].pb(y);
}
do
{
ok=0;
for (i=1;i<=n;i++)
viz[i]=0;
for (i=1;i<=n;i++)
if (!match1[i] && match(i))
{
rez++;
ok=1;
}
}while (ok);
cout<<2*n-rez<<'\n';
for (i=1;i<=n;i++)
if (!m1[i])
check(i);
for (i=1;i<=n;i++)
if (m1[i] && m2[i]) cout<<0<<'\n';
else if (m1[i]) cout<<2<<'\n';
else if (m2[i]) cout<<1<<'\n';
else cout<<3<<'\n';
}