Pagini recente » Cod sursa (job #2296228) | Cod sursa (job #773667) | Cod sursa (job #2631461) | Cod sursa (job #1391726) | Cod sursa (job #2591619)
#include <iostream>
#include <fstream>
#include <vector>
#define MAX 8200
using namespace std;
int n,m,n1,n2,ans;
bool acc[MAX],ex[2*MAX];
int l[MAX],r[MAX];
vector<int> nd[MAX];
bool pairup(int nod){
if(acc[nod])return 0;
acc[nod]=1;
for(auto i:nd[nod])
if(r[i]==0){
r[i]=nod;
l[nod]=i;
return 1;
}
for(auto i:nd[nod])
if(pairup(r[i])){
r[i]=nod;
l[nod]=i;
return 1;
}
return 0;
}
void cuplaj(){
bool test;
do{
test=0;
for(int i=1;i<=n;i++)acc[i]=0;
for(int i=1;i<=n;i++)
if(l[i]==0&&pairup(i))
test=1;
} while(test);
for(int i=1;i<=n;i++)ans+=(l[i]!=0);
}
void calc(int nod){
for(auto i:nd[nod])
if(!ex[n+i]){
ex[n+i]=1;
ex[r[i]]=0;
calc(r[i]);
}
}
int main()
{
ifstream f ("felinare.in");
ofstream g ("felinare.out");
f>>n>>m;
for(int i=1;i<=m;i++)
f>>n1>>n2,
nd[n1].push_back(n2);
cuplaj();
g<<2*n-ans<<'\n';
for(int i=1;i<=n;i++)
if(l[i])ex[i]=1;
for(int i=1;i<=n;i++)
if(!l[i])calc(i);
// for(int i=1;i<=2*n;i++)
// cout<<ex[i];
for(int i=1;i<=n;i++)
if(ex[i]&&ex[n+i])g<<"0\n";
else
if((ex[i]||ex[n+i])==0)g<<"3\n";
else
if(ex[i])g<<"2\n";
else g<<"1\n";
f.close ();
g.close ();
return 0;
}