Pagini recente » Cod sursa (job #1199864) | Cod sursa (job #635964) | Cod sursa (job #897612) | Istoria paginii runda/igorj | Cod sursa (job #1002309)
#include<fstream>
#include<vector>
#define N 8200
using namespace std;
ifstream f("felinare.in");
ofstream g("felinare.out");
int i,n,m,x,y,ok,nr,ok1[N],ok2[N],st[N],dr[N],viz[N];
vector<int>v[N];
inline bool cupleaza(int x)
{
if(viz[x])
return 0;
viz[x]=1;
for(vector<int>::iterator it=v[x].begin();it!=v[x].end();++it)
if(!dr[*it]||cupleaza(dr[*it]))
{
st[x]=*it;
dr[*it]=x;
return 1;
}
return 0;
}
inline void fa(int x)
{
for(vector<int>::iterator it=v[x].begin();it!=v[x].end();++it)
{
if(!ok2[*it])
{
ok2[*it]=1;
ok1[dr[*it]]=0;
fa(dr[*it]);
}
}
}
int main()
{
f>>n>>m;
for(i=1;i<=m;++i)
{
f>>x>>y;
v[x].push_back(y);
}
ok=1;
while(ok)
{
ok=0;
for(i=1;i<=n;++i)
viz[i]=0;
for(i=1;i<=n;++i)
if(!st[i]&&cupleaza(i))
{
ok=1;
++nr;
}
}
g<<2*n-nr<<'\n';
for(i=1;i<=n;++i)
if(st[i])
ok1[i]=1;
for(i=1;i<=n;++i)
if(!st[i])
fa(i);
for(i=1;i<=n;++i)
{
if(ok1[i]&&ok2[i])
g<<0<<'\n';
else
if(!ok1[i]&&ok2[i])
g<<1<<'\n';
else
if(ok1[i]&&!ok2[i])
g<<2<<'\n';
else
g<<3<<'\n';
}
return 0;
}