Pagini recente » Cod sursa (job #1879446) | Cod sursa (job #229114) | Cod sursa (job #925200) | Cod sursa (job #1543326) | Cod sursa (job #183117)
Cod sursa(job #183117)
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int NMAX=8200;
int n,m,f,st[NMAX],dr[2*NMAX],sst[NMAX],sdr[NMAX];
char viz[NMAX],s[NMAX];
vector<int> a[NMAX];
void citeste(){
int i,j,k;
scanf("%d %d",&n,&m);
for (k=1;k<=m;++k) {scanf("%d %d",&i,&j);
a[i].push_back(j);}
}
void cup(int vf){
vector<int>::iterator it;
if (!viz[vf]){
viz[vf]=1;
for (it=a[vf].begin();it!=a[vf].end();it++)
if (st[*it]==-1){
st[*it]=vf;
dr[vf]=*it;
return;}
for (it=a[vf].begin();it!=a[vf].end();it++){
cup(st[*it]);
if (dr[st[*it]]!=*it){
st[*it]=vf;
dr[vf]=*it;
return;}
}
}
}
void cuplaj(){
int i;
f=0;
memset(dr,-1,sizeof(dr));
for (i=1;i<=n;++i)
if (dr[i]==-1){
memset(viz,0,sizeof(viz));
cup(i);
if (dr[i]!=-1) f++;}
else f++;
}
void sup(int vf){
vector<int>::iterator it;
for (it=a[vf].begin();it!=a[vf].end();it++)
if (!sdr[*it]){
sdr[*it]=1;
sst[st[*it]]=0;
sup(st[*it]);}
}
void suport(){
int i;
memset(sst,0,sizeof(sst));
memset(sdr,0,sizeof(sdr));
for (i=1;i<=n;++i)
if (dr[i]!=-1) sst[i]=1;
for (i=1;i<=n;++i)
if (dr[i]==-1) sup(i);
}
void scrie(){
int i,k;
printf("%d\n",2*n-f);
for (i=1;i<=n;i++){
if (sst[i]+sdr[i]==0) k=3;
else if (sst[i]+sdr[i]==2) k=0;
else if (sst[i]==1) k=2;
else k=1;
printf("%d\n",k);}
}
int main(){
freopen("felinare.in","r",stdin);
freopen("felinare.out","w",stdout);
citeste();
cuplaj();
suport();
scrie();
return 0;
}