Pagini recente » Cod sursa (job #518315) | Cod sursa (job #546534) | Cod sursa (job #1927310) | Cod sursa (job #180788) | Cod sursa (job #1956322)
#include <cstdio>
#include <vector>
#include <bitset>
using namespace std;
vector<int> g[8200];
int cup[16400];
bitset<8200> vaz;
bitset<16400> elim;
int cupleaza(int nod)
{
if(vaz[nod]) return 0;
vaz[nod]=1;
for(vector<int>::iterator it=g[nod].begin();it!=g[nod].end();it++)
if(!cup[*it] || cupleaza(cup[*it]))
{
cup[nod]=*it;
cup[*it]=nod;
return 1;
}
return 0;
}
void solve(int nod)
{
elim[nod]=0;
for(vector<int>::iterator it=g[nod].begin();it!=g[nod].end();it++)
if(!elim[*it])
{
elim[*it]=1;
solve(cup[*it]);
}
}
int main()
{
freopen("felinare.in", "r", stdin);
freopen("felinare.out", "w", stdout);
int n,m,x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
g[x].push_back(n+y);
}
int ok=1;
while(ok)
{
ok=0;
vaz&=0;
for(int i=1;i<=n;i++)
if(!cup[i]) ok|=cupleaza(i);
}
for(int i=1;i<=n;i++)
if(cup[i]) elim[i]=1;
for(int i=1;i<=n;i++)
if(!cup[i]) solve(i);
int sol=2*n;
for(int i=1;i<=2*n;i++) sol-=elim[i];
printf("%d\n",sol);
for(int i=1;i<=n;i++) printf("%d\n",(!elim[i])|((!elim[i+n])<<1));
return 0;
}