Pagini recente » Cod sursa (job #2602940) | Cod sursa (job #953095) | Cod sursa (job #522617) | Cod sursa (job #255816) | Cod sursa (job #2676737)
#include <bits/stdc++.h>
#define Nmax 8192
using namespace std;
ifstream fin ("felinare.in");
ofstream fout ("felinare.out");
vector <int> v[2*Nmax];
int n, m, viz[2*Nmax], ma[2*Nmax];
int cuplaj(int x)
{
viz[x]=1;
for(auto it:v[x])
if(!ma[it] || (!viz[ma[it]] && cuplaj(ma[it])))
{
ma[x]=it;
ma[it]=x;
return 1;
}
return 0;
}
void elimina(int x)
{
for(auto it:v[x])
if(!viz[it])
{
viz[it]=1;
viz[ma[it]]=0;
elimina(ma[it]);
}
}
int main()
{
fin >> n >> m;
for(int i=1;i<=m;i++)
{
int x, y;
fin >> x >> y;
v[x].push_back(y+n);
v[y+n].push_back(x);
}
bool ok=1;
while(ok)
{
ok=0;
memset(viz, 0, sizeof(viz));
for(int i=1;i<=n;i++)
if(!viz[i] && !ma[i] && cuplaj(i))
ok=1;
}
int cup=0;
for(int i=1;i<=n;i++)
if(ma[i])
cup++;
fout << 2*n-cup << '\n';
memset(viz, 0, sizeof(viz));
for(int i=1;i<=n;i++)
if(ma[i])
viz[i]=1;
for(int i=1;i<=n;i++)
if(!ma[i])
elimina(i);
for(int i=1;i<=n;i++)
{
if(viz[i]==0 && viz[i+n]==0)
fout << 3;
else if(viz[i]==1 && viz[i+n]==0)
fout << 2;
else if(viz[i]==0 && viz[i+n]==1)
fout << 1;
else if(viz[i]==1 && viz[i+n]==1)
fout << 0;
fout << '\n';
}
return 0;
}