Pagini recente » Cod sursa (job #1032881) | Cod sursa (job #1634904) | Cod sursa (job #1477899) | Cod sursa (job #3124748) | Cod sursa (job #1948722)
#include <fstream>
#include <vector>
#include <string.h>
#define nMax 8192
#define pb push_back
using namespace std;
ifstream fin("felinare.in");
ofstream fout("felinare.out");
int n, m, cuplaj;
int viz[nMax], suppl[nMax], suppr[nMax], r[nMax], l[nMax];
vector<int> G[nMax];
bool pairup(int node)
{
if(viz[node])
return 0;
viz[node]=1;
for(vector<int>::iterator it=G[node].begin(); it!=G[node].end(); it++)
{
int fiu=*it;
if(l[fiu]==0)
{
r[node]=fiu;
suppl[node]=1;
l[fiu]=node;
cuplaj++;
return 1;
}
}
for(vector<int>::iterator it=G[node].begin(); it!=G[node].end(); it++)
{
int fiu=*it;
if(pairup(l[fiu]))
{
r[node]=fiu;
suppl[node]=1;
l[fiu]=node;
return 1;
}
}
return 0;
}
void support(int node)
{
for(vector<int>::iterator it=G[node].begin(); it!=G[node].end(); it++)
{
int fiu=*it;
if(suppr[fiu]==0)
{
suppr[fiu]=1;
suppl[l[fiu]]=0;
support(l[fiu]);
}
}
}
int main()
{
int a, b;
fin>>n>>m;
for(int i=1; i<=m; i++)
{
fin>>a>>b;
G[a].pb(b);
}
for(int change=1; change; )
{
change=0;
memset(viz, 0, sizeof(viz));
for(int node=1; node<=n; node++)
if(r[node]==0)
change|=pairup(node);
}
for(int node=1; node<=n; node++)
if(suppl[node]==0)
support(node);
fout<<2*n-cuplaj<<'\n';
for(int i=1; i<=n; i++)
fout<<(1-suppl[i]+2*(1-suppr[i]))<<'\n';
}