Pagini recente » Cod sursa (job #2309499) | Cod sursa (job #1832880) | Cod sursa (job #2910480) | Cod sursa (job #1103068) | Cod sursa (job #1486418)
#include <cstdio>
#include <vector>
#include <cstring>
#define nmax 20005
using namespace std;
int N,M,sol;
int viz[9000],st[9000],dr[9000],gout[9000],in[9000],o[9000];
vector<int>G[nmax];
inline bool Cupleaza(int nod){
if(viz[nod]) return false;
for(auto it:G[nod])
if(!dr[it]){
dr[it] = nod;
st[nod] = it;
return true;
}
viz[nod] = 1;
for(auto it:G[nod])
if(Cupleaza(dr[it])){
st[nod] = it;
dr[it] = nod;
return true;
}
return false;
}
inline void solve(){
int gata = 1,i;
while(gata){
gata = 0;
memset(viz,0,sizeof(viz));
for(i = 1; i <= N; ++i)
if(!st[i]&&Cupleaza(i))
gata = 1;
}
}
int main(){
int i,x,y;
freopen("felinare.in","r",stdin);
freopen("felinare.out","w",stdout);
scanf("%d %d\n",&N,&M);
for(i = 1; i <= M; ++i){
scanf("%d %d\n",&x,&y);
G[x].push_back(y);
++gout[x];
}
solve();
for(i = 1; i <= N; ++i){
if(!dr[i]) ++sol;
if(st[i]){
sol++;
o[i] = 1;
for(auto it:G[i])
in[it] = 1;
}
else ++sol;
}
printf("%d\n",sol);
for(i = 1; i <= N; ++i)
if(in[i] && o[i]) printf("3\n");
else if(in[i]) printf("1\n");
else if(o[i]) printf("2\n");
else printf("0\n");
return 0;
}