Pagini recente » Cod sursa (job #1815577) | Cod sursa (job #1962682) | Cod sursa (job #1672777) | Cod sursa (job #2687993) | Cod sursa (job #56245)
Cod sursa(job #56245)
using namespace std;
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <cassert>
#define NDEBUG
#define FIN "felinare.in"
#define FOUT "felinare.out"
#define maxn 8192
#ifndef NDEBUG
int stp;
#endif
vector<vector<bool> >a;
vector<vector<short> > x;
int n, m, E;
short source, sink;
short t[2*maxn];
short d[2*maxn];
bool Viz[3*maxn];
int bfs();
void solve();
void read()
{
int i,p, q;
scanf("%d %d\n", &n, &m);
a.clear();
x.clear();
a.resize(n+n+2);
for(i=0;i<n+n+2;i++) a[i].resize(n+n+2);
source=0;
sink=n+n+1;
x.resize(n+n+2);
for(i=0;i<m;++i)
{
scanf("%d %d\n", &p, &q);
a[p][q+n]=1;
x[p].push_back(q+n);
x[q+n].push_back(p);
}
for(i=1;i<=n;++i)a[source][i]=1, x[source].push_back(i), x[i].push_back(source);
for(i=n+1;i<sink;++i) a[i][sink]=1, x[i].push_back(sink), x[sink].push_back(i);
}
int bfs()
{
short Q[2*maxn], p=1, q=1;
bool viz[2*maxn];
memset(viz, 0,sizeof(viz));
memset(t, -1, sizeof(t));
memset(d, 0, sizeof(d));
viz[source]=1;
Q[1]=source;
d[1]=0;
int u, i;
vector<short>::iterator it;
while(p<=q)
{
u=Q[p++];
for(it=x[u].begin();it!=x[u].end();++it)
if(!viz[*it] && a[u][*it])
{
viz[*it]=1;
d[*it]=d[u]+1;
t[*it]=u;
Q[++q]=*it;
}
}
if(t[sink]==-1) return 0;
return 1;
}
void solve()
{
int i, j;
int p;
int nr=0,ok;
vector<short>::iterator it;
while(1)
{
p=bfs();
if(p==0) break;
for(it=x[sink].begin();it!=x[sink].end();++it)
{
if(d[*it]!=d[sink]-1)continue;
// if(Viz[*it]) continue;
if(t[*it]==-1) continue;
if(a[*it][sink]==0) continue;
ok=1;
for(j=*it;j!=source;j=t[j]) if(a[t[j]][j]==0){ ok=0; break;}
if(ok==0) continue;
a[*it][sink]=0;
a[sink][*it]=1;
for(j=*it;j!=source;j=t[j])
{
a[t[j]][j]=0;
a[j][t[j]]=1;
}
nr++;
}
}
//printf("%d\n", nr);
printf("%d\n", 2*n-nr);
}
int main()
{
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
read();
solve();
return 0;
}