Pagini recente » Cod sursa (job #2659351) | Cod sursa (job #2929255) | Cod sursa (job #1417138) | Cod sursa (job #2228013) | Cod sursa (job #1293283)
#include<cstdio>
#include<vector>
#include<cstring>
#define NMAX 20004
using namespace std;
int n,m,i,x,y,ok,nr;
int viz[NMAX],e[NMAX],R[NMAX],L[NMAX];
vector<int>v[NMAX];
bool cupleaza(int nod)
{
if (viz[nod]==1) return 0;
viz[nod]=1;
vector<int>::iterator it;
for (it=v[nod].begin();it!=v[nod].end();++it)
{
if (R[*it]==0)
{
L[nod]=*it;
R[*it]=nod;
return 1;
}
}
for (it=v[nod].begin();it!=v[nod].end();++it)
{
if (cupleaza(R[*it]))
{
L[nod]=*it;
R[*it]=nod;
return 1;
}
}
return 0;
}
void Sup(int nod)
{
vector<int>::iterator it;
for (it=v[nod].begin();it!=v[nod].end();++it)
{
if (e[*it]==0)
{
e[*it]=1;
e[R[*it]]=0;
Sup(R[*it]);
}
}
}
int main()
{
freopen("felinare.in","r",stdin);
freopen("felinare.out","w",stdout);
scanf("%d%d",&n,&m);
for (i=1;i<=m;++i)
{
scanf("%d%d",&x,&y);
v[n+x].push_back(y);
}
ok=0;
do
{
memset(viz,0,sizeof(viz));
ok=1;
for (i=n+1;i<=2*n;++i)
if (L[i]==0 && cupleaza(i)) ok=0;
}while(ok==0);
for (i=n+1;i<=2*n;++i)
if (L[i]!=0) e[i]=1;
for (i=1;i<=2*n;++i)
if (L[i]==0) Sup(i);
for (i=1;i<=2*n;++i)
if (e[i]==0) ++nr;
printf("%d\n",nr);
for (i=1;i<=n;++i)
{
if(e[i]==0 && e[i+n]==0) printf("3\n");
else if (e[i]==0 && e[i+n]==1) printf("2\n");
else if (e[i]==1 && e[i+n]==0) printf("1\n");
else printf("0\n");
}
return 0;
}