Pagini recente » Cod sursa (job #773401) | Cod sursa (job #464125) | Cod sursa (job #1024289) | Clasament concurs_2 | Cod sursa (job #419479)
Cod sursa(job #419479)
#include <fstream>
#include <vector>
using namespace std;
#define NMAX 8193
short st[NMAX],dr[NMAX],nv[NMAX];
bool Sst[NMAX],Sdr[NMAX],uz[NMAX];
vector <short> A[NMAX];
short n,m,cup;
void citire()
{
ifstream fin("felinare.in");
fin>>n>>m;
short i;
for (i=1;i<=m;++i)
{ short x,y;
fin>>x>>y;
A[x].push_back(y);
}
fin.close();
}
bool cupleaza(int x)
{ short i;
if (uz[x]) return 0;
uz[x]=true;
for (i=0;i<nv[x];++i)
if (!dr[A[x][i]])
{
dr[A[x][i]]=x;
st[x]=A[x][i];
return 1;
}
for (i=0;i<nv[x];++i)
if (cupleaza(dr[A[x][i]]))
{
st[x]=A[x][i];
dr[A[x][i]]=x;
return 1;
}
return 0;
}
void suport(short x)
{ short i;
for (i=0;i<nv[x];++i)
if (!Sdr[A[x][i]])
{
Sdr[A[x][i]]=true;
Sst[dr[A[x][i]]]=false;
suport(dr[A[x][i]]);
}
}
void afisare()
{
ofstream fout("felinare.out");
fout<<2*n-cup<<"\n";
short i;
for (i=1;i<=n;++i)
if (!Sst[i])
if (!Sdr[i]) fout<<"3\n";
else fout<<"1\n";
else
if (!Sdr[i]) fout<<"2\n";
else fout<<"0\n";
//fout<<1-Sst[i]+2*(1-Sdr[i])<<"\n";
fout.close();
}
int main()
{
citire();
//cuplaj
short i;
for (i=1;i<=n;++i)
{ st[i]=dr[i]=0; nv[i]=A[i].size();}
bool change;
do
{
change=false;
memset(uz,0,sizeof(uz));
for (i=1;i<=n;++i)
if (!st[i])
change|=cupleaza(i);
}
while (change);
cup=0;
for (i=1;i<=n;++i)
if (st[i]) {++cup; Sst[i]=1;}
//suport
for (i=1;i<=n;++i)
if (!Sst[i]) suport(i);
afisare();
return 0;
}