Pagini recente » Cod sursa (job #685161) | Cod sursa (job #2767469) | Cod sursa (job #646230) | Cod sursa (job #2726759) | Cod sursa (job #1882315)
#include <bits/stdc++.h>
#define maxN 8200
using namespace std;
int sol[maxN];
bool seen[maxN],ok;
int _left[maxN],_right[maxN];
int supleft[maxN],supright[maxN];
int n,m,i,j,x,y,maxmatch;
vector<int> v[maxN];
bool pairup(int nod)
{
if(seen[nod])
return false;
seen[nod]=true;
for(auto it:v[nod])
if(!_right[it])
{
_left[nod]=it;
_right[it]=nod;
return true;
}
for(auto it:v[nod])
if(pairup(_right[it]))
{
_left[nod]=it;
_right[it]=nod;
return true;
}
return false;
}
void support(int nod)
{
for(auto it:v[nod])
if(!supright[it])
{
supright[it]=1;
supleft[_left[it]]=0;
support(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[x].push_back(y);
ok=true;
while(ok)
{
ok=false;
memset(seen,false,sizeof(seen));
for(i=1;i<=n;i++)
if(!_left[i] && pairup(i))
ok=true;
}
for(i=1;i<=n;i++)
if(_left[i])
supleft[i]=1,
maxmatch++;
printf("%d\n",2*n-maxmatch);
for(i=1;i<=n;i++)
if(!_left[i])
support(i);
for(i=1;i<=n;i++)
{
if(!supleft[i])
sol[i]++;
if(!supright[i])
sol[i]+=2;
}
for(i=1;i<=n;i++)
printf("%d\n",sol[i]);
return 0;
}