Pagini recente » Cod sursa (job #169925) | Cod sursa (job #2079123) | Cod sursa (job #1623997) | Cod sursa (job #1260872) | Cod sursa (job #1202391)
#include <fstream>
#include <bitset>
#include <vector>
#define NMAX 8205
using namespace std;
vector<int> graf[NMAX];
bitset<NMAX> viz;
int st[NMAX];
int dr[NMAX];
int st_grad[NMAX];
int dr_grad[NMAX];
bool cupl(int nod)
{
if(viz[nod])
return 0;
viz[nod]=1;
for(vector<int>::iterator it=graf[nod].begin();it!=graf[nod].end();it++)
if(!dr[*it]){
st[nod]=*it;
dr[*it]=nod;
return 1;
}
for(vector<int>::iterator it=graf[nod].begin();it!=graf[nod].end();it++)
if(cupl(dr[*it])){
st[nod]=*it;
dr[*it]=nod;
return 1;
}
return 0;
}
int main()
{
ifstream cin("felinare.in");
ofstream cout("felinare.out");
int n=0,m=0,a,b;
cin>>n>>m;
while(m--){
cin>>a>>b;
graf[a].push_back(b);
st_grad[a]++;
dr_grad[b]++;
}
bool ok=true;
while(ok){
ok=false;
viz&=0;
for(int i=1;i<=n;i++)
if(!st[i] && cupl(i))
ok=true;
}
int cuplaj=0;
for(int i=1;i<=n;i++)
if(st[i]){
cuplaj++;
st_grad[i]--;
dr_grad[st[i]]--;
int vec=st[i];
if(st_grad[i])
st[i]=1,dr[vec]=0;
else if(dr_grad[i])
dr[vec]=1,st[i]=0;
else
st[i]=1,dr[vec]=0;
}
cout<<2*n-cuplaj<<'\n';
for(int i=1;i<=n;i++){
st[i]=1-st[i];
dr[i]=1-dr[i];
cout<<((st[i]<<1)+dr[i])<<'\n';
}
cin.close();
cout.close();
return 0;
}