Pagini recente » Cod sursa (job #1686388) | Cod sursa (job #401591) | Cod sursa (job #2491754) | Cod sursa (job #111735) | Cod sursa (job #2772582)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("felinare.in");
ofstream fout("felinare.out");
int n,m,i,R[9000],L[9000],x,y,sol,ok,U[9000],D[9000];
vector<int> A[9000];
bitset<9000> f;
int cuplaj(int nod){
if(f[nod])
return 0;
f[nod]=1;
for(int i=0;i<A[nod].size();i++){
int vec=A[nod][i];
if(!R[vec]){
R[vec]=nod;
L[nod]=vec;
sol++;
return 1;
}
}
for(int i=0;i<A[nod].size();i++){
int vec=A[nod][i];
if(cuplaj(R[vec])){
R[vec]=nod;
L[nod]=vec;
return 1;
}
}
return 0;
}
void cover(int nod){
for(int i=0;i<A[nod].size();i++){
int vec=A[nod][i];
if(!D[vec]){
D[vec]=1;
U[R[vec]]=0;
cover(R[vec]);
}
}
}
int main(){
fin>>n>>m;
for(i=1;i<=m;i++){
fin>>x>>y;
A[x].push_back(y);
}
do{
ok=0;
f.reset();
for(i=1;i<=n;i++)
if(!L[i])
ok|=cuplaj(i);
}while(ok);
fout<<2*n-sol<<"\n";
for(i=1;i<=n;i++)
if(!L[i])
cover(i);
else
U[i]=1;
for(i=1;i<=n;i++){
if(!U[i]&&!D[i])
fout<<"3\n";
if(U[i]&&!D[i])
fout<<"2\n";
if(!U[i]&&D[i])
fout<<"1\n";
if(U[i]&&D[i])
fout<<"0\n";
}
return 0;
}