Pagini recente » Cod sursa (job #1560134) | Cod sursa (job #2389582) | Cod sursa (job #3131790) | Cod sursa (job #2058715) | Cod sursa (job #381103)
Cod sursa(job #381103)
#include<stdio.h>
#include<bitset>
#include<vector>
#include<string.h>
using namespace std;
#define N 8200
#define pb push_back
int n,m;
bitset<N> viz,sa,sb;
vector<int> a[N];
int ca[N],cb[N];
char rez[N];
inline void citire()
{
scanf("%d%d",&n,&m);
int x,y;
for(int i=0; i<m; ++i)
{
scanf("%d%d",&x,&y);
a[x].pb(y);
}
memset(rez,3,sizeof(rez));
}
bool pairUp(int nod)
{
if(viz[nod]==1)
return false;
viz[nod]=1;
for(size_t i=0,lim=a[nod].size(); i<lim; ++i)
{
if(cb[a[nod][i]]==0)
{
ca[nod]=a[nod][i];
cb[a[nod][i]]=nod;
sa[nod]=1;
return true;
}
}
for(size_t i=0,lim=a[nod].size(); i<lim; ++i)
{
if(pairUp(cb[a[nod][i]]))
{
ca[nod]=a[nod][i];
cb[a[nod][i]]=nod;
sa[nod]=1;
return true;
}
}
return false;
}
void suport(int nod)
{
if(nod==0)
return;
for(size_t i=0,lim=a[nod].size(); i<lim; ++i)
{
if(sb[a[nod][i]]==0)
{
sb[a[nod][i]]=1;
sa[cb[a[nod][i]]]=0;
suport(cb[a[nod][i]]);
}
}
}
inline void rezolva()
{
bool change=true;
int r=0;
while(change)
{
change=false;
viz.reset();
for(int i=1; i<=n; ++i)
{
if(ca[i]==0 && viz[i]==0)
{
if(pairUp(i)==true)
{
change|=true;
++r;
}
}
}
}
printf("%d\n",(n<<1)-r);
for(int i=1; i<=n; ++i)
{
if(sa[i]==0)
suport(i);
}
}
inline void scrie()
{
for(int i=1; i<=n; ++i)
{
fputc(rez[i]-(sa[i]==1 ? 1 : 0)-(sb[i]==1 ? 2 : 0)+'0',stdout);
fputc('\n',stdout);
}
}
int main()
{
freopen("felinare.in","r",stdin);
freopen("felinare.out","w",stdout);
citire();
rezolva();
scrie();
return 0;
}