Pagini recente » Cod sursa (job #1477355) | Cod sursa (job #1986356) | Cod sursa (job #3206933) | Cod sursa (job #3179189) | Cod sursa (job #2142452)
#include <cstdio>
#include <vector>
using namespace std;
vector<int> v[8200];
int st[8200],dr[8200],rez[8200],cup1[8200],cup2[8200];
char vaz[8200];
int cupleaza(int nod)
{
if(vaz[nod]==1) return 0;
vaz[nod]=1;
for(int i=0;i<v[nod].size();i++)
if(cup2[v[nod][i]]==0 or cupleaza(cup2[v[nod][i]])>0)
{
cup1[nod]=v[nod][i];
cup2[v[nod][i]]=nod;
return 1;
}
return 0;
}
void dfs(int nod)
{
for(int i=0;i<v[nod].size();i++)
{
int vec=v[nod][i];
if(dr[vec]==0)
{
dr[vec]=1;
st[cup2[vec]]=0;
dfs(cup2[vec]);
}
}
}
int main()
{
freopen("felinare.in","r",stdin);
freopen("felinare.out","w",stdout);
int n,m,x,y,sol=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
v[x].push_back(y);
}
int ok=1;
while(ok>0)
{
ok=0;
for(int i=1;i<=n;i++) vaz[i]=0;
for(int i=1;i<=n;i++)
if(cup1[i]==0) ok+=cupleaza(i);
}
for(int i=1;i<=n;i++)
if(cup1[i]>0) {sol++;st[i]=1;}
printf("%d\n",2*n-sol);
for(int i=1;i<=n;i++)
if(st[i]==0) dfs(i);
for(int i=1;i<=n;i++)
if(st[i]==0) rez[i]=1;
for(int i=1;i<=n;i++)
if(dr[i]==0)
{
if(rez[i]==0) rez[i]=2;
else rez[i]=3;
}
for(int i=1;i<=n;i++) printf("%d\n",rez[i]);
return 0;
}