Pagini recente » Cod sursa (job #361538) | Cod sursa (job #2218680) | Cod sursa (job #1709892) | Cod sursa (job #2818577) | Cod sursa (job #2669726)
#include <bits/stdc++.h>
using namespace std;
ifstream in("felinare.in");
ofstream out("felinare.out");
const int lim=8200;
vector<int> vec[lim];
int l[lim],r[lim];
bool ok[lim];
bool go(int nod)
{
if(ok[nod])
return false;
ok[nod]=true;
for(int x:vec[nod])
if(!l[x])
{
l[x]=nod;
r[nod]=x;
return true;
}
for(int x:vec[nod])
if(go(l[x]))
{
l[x]=nod;
r[nod]=x;
return true;
}
return false;
}
bool sl[lim];
bool sr[lim];
void df(int nod)
{
sl[nod]=false;
ok[nod]=true;
for(int x:vec[nod])
if(!ok[l[x]])
{
sr[x]=true;
df(l[x]);
}
}
int main()
{
int n,m,x,y;
in>>n>>m;
for(int i=1;i<=m;++i)
{
in>>x>>y;
vec[x].push_back(y);
}
int cuplaj=0;
bool modif;
do
{
for(int i=1;i<=n;++i)
ok[i]=false;
modif=false;
for(int i=1;i<=n;++i)
if(!r[i] and go(i))
{
++cuplaj;
modif=true;
}
}while(modif);
out<<2*n-cuplaj<<'\n';
for(int i=1;i<=n;++i)
if(r[i])
{
sl[i]=true;
ok[i]=false;
}
for(int i=1;i<=n;++i)
if(!r[i]) df(i);
for(int i=1;i<=n;++i)
if(sl[i] and sr[i])
out<<0<<'\n';
else if(sl[i] and !sr[i])
out<<2<<'\n';
else if(!sl[i] and sr[i])
out<<1<<'\n';
else out<<3<<'\n';
return 0;
}