Pagini recente » Cod sursa (job #1907090) | Cod sursa (job #2829515) | Cod sursa (job #3210650) | Cod sursa (job #2327237) | Cod sursa (job #2524255)
#include <bits/stdc++.h>
#define NM 2*8195
using namespace std;
ifstream fin ("felinare.in");
ofstream fout ("felinare.out");
void read();
vector<int> v[NM];
int n, m, ma[NM], cp;
bitset<NM> viz, st, in;
bool cuplaj(int nod)
{
if(viz[nod])
return 0;
viz[nod] = 1;
for(auto it:v[nod])
if(!ma[it])
{
ma[nod] = it;
ma[it] = nod;
return 1;
}
for(auto it:v[nod])
if(ma[it] && cuplaj(ma[it]) && ma[it]!=nod)
{
ma[nod] = it;
ma[it] = nod;
return 1;
}
return 0;
}
void dfs(int nod)
{
if(viz[nod])
return ;
viz[nod] = 1;
for(auto it:v[nod])
if(!viz[it] && !ma[it])
{
viz[it] = 1;
return ;
}
else if(!viz[it] && ma[it])
{
viz[it] = 1;
dfs(ma[it]);
}
}
int main()
{
read();
bool ok = 1;
while(ok)
{
for(int i=1; i<=2*n; ++i)
viz[i] = 0;
ok = 0;
for(int i=1; i<=n; i++)
if(!viz[i] && !ma[i])
{
if(cuplaj(i))
ok = 1;
}
}
for(int i=1; i<=n; i++)
if(ma[i])
cp++;
for(int i=1; i<=2*n; i++)
viz[i] = 0;
for(int i=1; i<=n; i++)
if(!ma[i])
dfs(i);
for(int i=n+1; i<=2*n; i++)
if(viz[i])
st[i] = 1;
for(int i=1; i<=n; i++)
if(!viz[i])
st[i] = 1;
int nr = 0;
for(int i=1; i<=2*n; i++)
if(!st[i])
++nr, in[i] = 1;
fout << 2*n-cp << '\n';
for(int i=1; i<=n; i++)
if(!in[i] && !in[i+n])
fout << 0 << '\n';
else if(in[i] && !in[i+n])
fout << 1 << '\n';
else if(!in[i] && in[i+n])
fout << 2 << '\n';
else fout << 3 << '\n';
return 0;
}
void read()
{
fin >> n >> m;
for(int i=1; i<=m; ++i)
{
int x, y;
fin >> x >> y;
y+=n;
v[x].push_back(y);
}
}