Pagini recente » Cod sursa (job #1914982) | Cod sursa (job #1001907) | Cod sursa (job #711195) | Cod sursa (job #2099039) | Cod sursa (job #1478383)
#include <fstream>
#include <vector>
#define Nmax 17000
#define pb push_back
using namespace std;
vector <int> L[Nmax];
int st[Nmax],dr[Nmax],n;
bool viz[Nmax],mark[Nmax];
inline bool Cuplez(int nod)
{
if(viz[nod]) return false;
for(auto it : L[nod])
if(!dr[it])
{
st[nod]=it; dr[it]=nod; return true;
}
viz[nod]=true;
for(auto it : L[nod])
if(Cuplez(dr[it]))
{
st[nod]=it; dr[it]=nod; viz[nod]=false;
return true;
}
return false;
}
inline void Solve(int nod)
{
for(auto it : L[nod])
if(!mark[it])
{
mark[it]=true; mark[dr[it]]=false; Solve(dr[it]);
}
}
int main()
{
int x,y,m,gata=0,sol=0,i;
ifstream cin ("felinare.in");
ofstream cout ("felinare.out");
cin>>n>>m;
while(m--)
{
cin>>x>>y;
L[x].pb(y+n); L[y+n].pb(x);
}
while(!gata)
{
gata=1;
for(i=1;i<=n;++i) viz[i]=false;
for(i=1;i<=n;++i)
if(!st[i] && Cuplez(i))
{
++sol; gata=0;
}
}
for(i=1;i<=n;++i)
if(st[i]) mark[i]=true;
for(i=1;i<=n;++i)
if(!st[i]) Solve(i);
cout<<2*n-sol<<"\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;
}