Pagini recente » Cod sursa (job #1682185) | Cod sursa (job #13507) | Cod sursa (job #817513) | Cod sursa (job #43458) | Cod sursa (job #169472)
Cod sursa(job #169472)
#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;
}