Cod sursa(job #56329)

Utilizator gigi_becaliGigi Becali gigi_becali Data 29 aprilie 2007 13:34:33
Problema Felinare Scor 2
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 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<bool>a[maxn];
vector<short> x[maxn];
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(d[sink]==0) return 0;
	return 1;
}



int flow, ok=1, dsink,nr;
void dfs(int nd)
{
//	printf("(%d %d)\n", nd, nr);
  if(nr>dsink)return;

  if(nd==sink && nr==dsink){++flow; ok=0; return;} 
//  if(nd==sink) return;
  if(nd!=source)Viz[nd]=1;
    else ok=1;//if(nr==d[sink])return;
  vector<short>::iterator it;

  for(it=x[nd].begin(); it!=x[nd].end(); ++it)
    if(!Viz[*it] && a[nd][*it] && ok)
      {
	++nr;
	dfs(*it);
	--nr;
	if(!ok)
	{
		a[nd][*it]=0;
		a[*it][nd]=1;
		break;	
	}

      }

}



void solve()
{
	int i, j;
	int p;
	
	flow=0;
	vector<short>::iterator it;
	while(1)
	{
		p=bfs();
		//	printf("(%d ++\n", p);
	//	for(i=source;i<=sink;++i)printf("%d ", d[i]);
	//	printf("\n");
		if(p==0) break;

		//printf("(%d)\n", d[sink]);
		
		memset(Viz, 0, sizeof(Viz));
		ok=1;
		nr=0;
		dsink=d[sink];	
		dfs(source);



	}
	printf("%d\n", 2*n-flow);
	
}






int main()
{
	freopen(FIN, "r", stdin);
	freopen(FOUT, "w", stdout);

	read();
	solve();
	
	return 0;
}