Pagini recente » Cod sursa (job #698096) | Cod sursa (job #2346918) | Cod sursa (job #1028804) | Cod sursa (job #1832576) | Cod sursa (job #420547)
Cod sursa(job #420547)
#include<cstdio>
#include<vector>
#include<bitset>
using namespace std;
#define sh short int
#define pb push_back
#define NM 8195
bitset<NM>viz,v;
vector<sh>a[NM];
sh y,N,M,x,r[NM],l[NM],card,rez;
bool df(sh n)
{
if (viz[n])
return false;
viz[n]=true;
size_t g=a[n].size(),i;
for (i=0; i<g; ++i)
{
y=a[n][i];
if (!r[y])
{
l[n]=y;
r[y]=n;
return true;
}
}
for (i=0; i<g; ++i)
{
y=a[n][i];
if (!df(y))
{
l[n]=y;
r[y]=n;
return true;
}
}
return false;
}
void dfs(sh n)
{
v[n]=1;
if (viz[n])
++card;
size_t g=a[n].size(),i;
for (i=0; i<g; ++i)
{
y=a[n][i];
if (v[y])
continue;
dfs(y);
}
}
int main()
{
freopen("felinare.in","r",stdin);
freopen("felinare.out","w",stdout);
scanf("%hd%hd",&N,&M);
while (M--)
{
scanf("%hd%hd",&x,&y);
a[x].pb(y);
}
bool ok=true;
sh i;
while(ok)
{
ok=false;
viz.reset();
for (i=1; i<=N; ++i)
if (!l[i])
ok|=df(i);
}
for (i=1; i<=N; ++i)
a[i].clear();
viz.reset();
for (i=1; i<=N; ++i)
if (r[i])
{
a[i].pb(l[i]);
viz[i]=true;
}
for (i=1; i<=N; ++i)
{
if (!v[i]&&viz[i])
{
card=0;
dfs(i);
if (card==3)
rez+=2;
else
rez+=card;
}
}
printf("%hd\n",2*N-rez);
return 0;
}