Pagini recente » Cod sursa (job #219644) | Cod sursa (job #531436) | Cod sursa (job #1933894) | Cod sursa (job #2557326) | Cod sursa (job #577218)
Cod sursa(job #577218)
#include <cstdio>
#include <vector>
#define MaxN 9002
#define infile "felinare.in"
#define outfile "felinare.out"
using namespace std;
vector <int> G[MaxN];
int N,M,dr[MaxN],st[MaxN],uz[MaxN],ss[MaxN],sd[MaxN],c;
void read()
{
int i,x,y;
scanf("%d%d",&N,&M);
for(i=1;i<=M;i++)
{
scanf("%d%d",&x,&y);
G[x].push_back(y);
}
}
int pairs(int nod)
{
if(uz[nod]) return 0;
uz[nod]=1;
int i;
for(i=0;i<G[nod].size();i++)
if(!st[G[nod][i]] || pairs(st[G[nod][i]]))
{
dr[nod]=G[nod][i];
st[G[nod][i]]=nod;
return 1;
}
return 0;
}
void pairs2(int nod)
{
int i;
for(i=0;i<G[nod].size();i++)
if(!sd[G[nod][i]])
{
sd[G[nod][i]]=1;
ss[st[G[nod][i]]]=0;
pairs2(st[G[nod][i]]);
}
}
void solve()
{
int sw=1,i;
while(sw)
{
sw=0;
memset(uz,0,sizeof(uz));
for(i=1;i<=N;i++)
if(!dr[i] && pairs(i))
sw=1;
}
for(i=1;i<=N;i++)
if(dr[i]) ss[i]=1;
for(i=1;i<=N;i++)
if(!dr[i]) pairs2(i);
}
void write()
{
int i;
for(i=1;i<=N;i++)
if(dr[i]) c++;
printf("%d\n",2*N-c);
for(i=1;i<=N;i++)
{
if(!ss[i] && !sd[i]) printf("3\n");
if(ss[i] && !sd[i]) printf("2\n");
if(!ss[i] && sd[i]) printf("1\n");
if(ss[i] && sd[i]) printf("0\n");
}
}
int main()
{
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
read();
solve();
write();
fclose(stdin);
fclose(stdout);
return 0;
}