Cod sursa(job #169472)

Utilizator mike4problemsRadu Gabriel mike4problems Data 1 aprilie 2008 18:38:42
Problema Felinare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include<fstream>
#include<iostream>
#include<cstring>
using namespace std;

ifstream fin("felinare.in");
ofstream fout("felinare.out");

#define M 20000
#define N 8191

int g[2*M+4*N+1][5];
int start[2*N+3],val;
int n,m,k,viz[2*N+3],c[2*N+3],poz[2*N+3];

inline void add(int i,int j)
{
	g[++k][0]=start[i];
	start[i]=k;
	g[k][1]=j;
	g[k][2]=1;
	g[k][4]=++k;
	g[k][0]=start[j];
	start[j]=k;
	g[k][1]=i;
	g[k][4]=k-1;
}

void read()
{
	int i,j,k=0;
	fin>>n>>m;
	while(m--)
	{
		fin>>i>>j;
		j+=n; add(i,j);
	}
	for(i=2*n+1,j=1;j<=n;j++)
		add(i,j);
	for(i=n+1,j=2*n+2;i<=2*n;i++)
		add(i,j);
}

int drum()
{
	int st,end,k;
	memset(viz,0,(2*N+3)*sizeof(int));
	for(viz[c[st=end=1]=2*n+1]=-1;st<=end;st++)
		for(k=start[c[st]];k;k=g[k][0])
			if(!viz[g[k][1]]&&g[k][2]-g[k][3]>0)

	{
		c[++end]=g[k][1]; poz[end]=k;
		viz[c[end]]=st;
		//cout<<c[end]<<' ';
		if(c[end]==2*n+2) return end;

	}
	return 0;
}

void modi(int k)
{
	//cout<<"modi...\n";
	while(viz[c[k]]!=-1)
	{
		//cout<<poz[k]<<' '<<g[poz[k]][1]<<' '<<g[poz[k]][2]<<' '<<g[poz[k]][3]<<' '<<g[poz[k]][4]<<'\n';
		g[poz[k]][3]++;
		g[g[poz[k]][4]][3]--;
		//cout<<poz[k]<<' '<<g[poz[k]][1]<<' '<<g[poz[k]][2]<<' '<<g[poz[k]][3]<<' '<<g[poz[k]][4]<<'\n';
		k=viz[c[k]];
	}
	//cin>>k;
}

void flow()
{
	for(int t=drum();t;t=drum(),val++) 
	{
		//cout<<val+1<<'\n';
		modi(t);
	}
}

int main()
{
	read();
	flow();
	fout<<2*n-val<<'\n';
	return 0;
}