Pagini recente » Cod sursa (job #2312824) | Cod sursa (job #2927370) | Cod sursa (job #1583770) | Cod sursa (job #2281070) | Cod sursa (job #2666121)
#include <fstream>
#include <bitset>
#include <vector>
#define K 8200
using namespace std;
ifstream fin("felinare.in");
ofstream fout("felinare.out");
int n,m,i,x,y,ok,sol,st[K],dr[K],ST[K],DR[K];
bitset <K> viz;
vector <int> v[K];
int cupleaza(int nod){
if(viz[nod])return 0;
viz[nod]=1;
for(auto vecin:v[nod])
if(!dr[vecin]){
dr[vecin]=nod;
st[nod]=vecin;
sol++; return 1;
}
for(auto vecin:v[nod])
if(cupleaza(dr[vecin])){
dr[vecin]=nod;
st[nod]=vecin;
return 1;
}
return 0;
}
int dfs(int nod){
for(auto vecin:v[nod])
if(!DR[vecin]){
DR[vecin]=1;
ST[dr[vecin]]=0;
dfs(dr[vecin]);
}
}
int main(){
fin>>n>>m;
for(i=1;i<=n;i++){
fin>>x>>y;
v[x].push_back(y);
}
ok=1;
while(ok){
ok=0;
viz.reset();
for(i=1;i<=n;i++)
if(!st[i] && cupleaza(i))
ok=1;
}
fout<<2*n-sol<<"\n";
for(i=1;i<=n;i++)
if(!ST[i])
dfs(i);
//ST[i]=0 => felinarul stg (primul) din orasul i e aprins
for(i=1;i<=n;i++){
if(ST[i] && DR[i])
fout<<"0\n";
if(!ST[i] && DR[i])
fout<<"1\n";
if(ST[i] && !DR[i])
fout<<"2\n";
if(!ST[i] && !DR[i])
fout<<"3\n";
}
return 0;
}