Pagini recente » Cod sursa (job #1149447) | Cod sursa (job #536540) | Cod sursa (job #1211439) | Cod sursa (job #2596799) | Cod sursa (job #913543)
Cod sursa(job #913543)
#include<cstdio>
#include<vector>
#define NMAX 8200
#define vec G[nod][i]
using namespace std;
FILE *fin,*fout;
vector<short> G[NMAX];
short n,l[NMAX],r[NMAX],c;
bool use[NMAX],useL[NMAX],useR[NMAX];
void read()
{
fin=fopen("felinare.in","r");
short m,x,y;
fscanf(fin,"%hd %hd",&n,&m);
while(m--)
{
fscanf(fin,"%hd %hd",&x,&y);
G[x].push_back(y);
}
fclose(fin);
}
void print()
{
fout=fopen("felinare.out","w");
fprintf(fout,"%hd\n",2*n-c);
for(int i=1;i<=n;i++)
fprintf(fout,"%hd\n",(1^useL[i])+2*(1^useR[i]));
fclose(fout);
}
bool pairup(int nod)
{
if(use[nod])
return 0;
use[nod]=1;
for(size_t i=0;i<G[nod].size();i++)
if(!l[vec] || pairup(l[vec]))
{
l[vec]=nod;
r[nod]=vec;
useL[nod]=1;
return 1;
}
return 0;
}
void suport(int nod)
{
for(size_t i=0;i<G[nod].size();i++)
if(!useR[vec])
{
useR[vec]=1;
useL[l[vec]]=0;
suport(l[vec]);
}
}
void solve()
{
for(short sw=1;sw;)
{
for(int i=0;i<=n;i++)
use[i]=0;
sw=0;
for(int i=1;i<=n;i++)
if(!r[i])
sw|=pairup(i);
}
for(int i=1;i<=n;i++)
if(l[i])
c++;
for(int i=1;i<=n;i++)
if(!useL[i])
suport(i);
}
int main()
{
read();
solve();
print();
return 0;
}