Pagini recente » Arhiva de probleme | Cod sursa (job #1767078) | Cod sursa (job #2476569) | Cod sursa (job #326076) | Cod sursa (job #1953952)
#include <bits/stdc++.h>
#define Nmax 20005
#define pb push_back
using namespace std;
vector <int> L[Nmax];
bool viz[Nmax],mark[Nmax];
int n,st[Nmax],dr[Nmax];
inline bool Cuplez(int nod)
{
if(viz[nod]) return 0;
for(auto it : L[nod])
if(!dr[it])
{
st[nod]=it; dr[it]=nod;
return 1;
}
viz[nod]=1;
for(auto it : L[nod])
if(Cuplez(dr[it]))
{
st[nod]=it; dr[it]=nod;
viz[nod]=0;
return 1;
}
return 0;
}
inline int Cuplaj()
{
int gata=0,sol=0,i;
while(!gata)
{
gata=1;
for(i=1;i<=n;++i) viz[i]=0;
for(i=1;i<=n;++i)
if(!st[i] && Cuplez(i))
{
++sol; gata=0;
}
}
return sol;
}
inline void Solve(int nod)
{
for(auto it : L[nod])
{
mark[dr[it]]=0; mark[it]=1; Solve(dr[it]);
}
}
inline void Mvc()
{
int i;
for(i=1;i<=n;++i)
if(st[i]) mark[i]=1;
for(i=1;i<=n;++i)
if(!st[i]) Solve(i);
}
int main()
{
int x,y,m,i;
ifstream cin("felinare.in");
ofstream cout("felinare.out");
cin>>n>>m;
while(m--)
{
cin>>x>>y;
L[x].pb(y+n);
}
int mvc = Cuplaj();
Mvc();
cout<<2*n-mvc<<"\n";
for(i=1;i<=n;++i)
if(!mark[i])
{
if(!mark[i+n]) cout<<"3\n";
else cout<<"1\n";
}
else
{
if(!mark[i+n]) cout<<"2\n";
else cout<<"0\n";
}
return 0;
}