Cod sursa(job #56238)

Utilizator gigi_becaliGigi Becali gigi_becali Data 29 aprilie 2007 10:14:16
Problema Felinare Scor 22
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
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;
}