Pagini recente » Cod sursa (job #2294287) | Cod sursa (job #2925515) | Cod sursa (job #555211) | Cod sursa (job #2420842) | Cod sursa (job #2627602)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("felinare.in");
ofstream cout("felinare.out");
vector<int> vec[8200];
bool sl[8200],sr[8200];
int l[8200],r[8200];
bool ok[8200];
bool path(int nod)
{
if(ok[nod])
return false;
ok[nod]=true;
for(int x:vec[nod])
if(!l[x] or path(l[x]))
{
r[nod]=x;
l[x]=nod;
return true;
}
return false;
}
void df(int nod)
{
ok[nod]=true;
sl[nod]=false;
for(int x:vec[nod])
if(!ok[l[x]])
{
sr[x]=true;
df(l[x]);
}
}
int main()
{
int n,m,a,b;
cin>>n>>m;
for(int i=1;i<=m;++i)
{
cin>>a>>b;
vec[a].push_back(b);
}
bool modif;
int cuplaj=0;
do
{
for(int i=1;i<=n;++i)
ok[i]=false;
modif=false;
for(int i=1;i<=n;++i)
if(!r[i] and path(i))
{
++cuplaj;
modif=true;
}
}while(modif);
cout<<2*n-cuplaj<<'\n';
for(int i=1;i<=n;++i)
if(r[i])
{
sl[i]=true;
ok[i]=false;
}
for(int i=1;i<=n;++i)
if(!r[i]) df(i);
for(int i=1;i<=n;++i)
if(sl[i]==true and sr[i]==true) cout<<0<<'\n';
else if(sl[i]==false and sr[i]==true) cout<<1<<'\n';
else if(sl[i]==true and sr[i]==false) cout<<2<<'\n';
else cout<<3<<'\n';
return 0;
}