Pagini recente » Cod sursa (job #2241743) | Cod sursa (job #639757) | Cod sursa (job #1986092) | Cod sursa (job #2494712) | Cod sursa (job #862952)
Cod sursa(job #862952)
#include <stdio.h>
#define NMAX 8200
#define MMAX 20003
#define alias(x) (n+x)
#define SURSA 0
#define DESTINATIA (2*n+1)
#define Infinity (0x3f3f3f3f)
int i,j,n,m,Cap[2*NMAX][2*NMAX],Flux[2*NMAX][2*NMAX],DRez[2*NMAX];
int C[2*NMAX],up[2*NMAX],Mark[2*NMAX];
int A[NMAX][NMAX];
#define old (C[st])
void GetDrumRez(int S, int D)
{
int i,st=0,end,poz=0,j;
for (i=1;i<=n;i++)
C[i]=up[i]=Mark[i]=0;
C[++st]=S; up[st]=0; end=1; Mark[S]=1;
for (st=1;st<=end;st++)
{
for (j=1;j<=A[old][0];j++)
if (!Mark[A[old][j]] && Cap[old][A[old][j]]-Flux[old][A[old][j]]>0)
{
C[++end]=A[old][j];
up[end]=st;
Mark[A[old][j]]=1;
if (A[old][j]==D) { poz=end; break; }
}
if (poz==end) break;
}
while (poz)
{
DRez[++DRez[0]]=C[poz];
poz=up[poz];
}
}
#define back (DRez[i+1])
#define front (DRez[i])
int GetFlux(int S, int D)
{
int gasit=1,i;
while (gasit)
{
for (i=1;i<=DRez[0];i++) DRez[i]=0; DRez[0]=0;
GetDrumRez(S,D);
if (!DRez[0])
gasit=0;
else {
int md=Infinity;
for (i=DRez[0]-1;i>=1;i--)
if (Cap[back][front]-Flux[back][front]<md)
md=Cap[back][front]-Flux[back][front];
for (i=DRez[0]-1;i>=1;i--)
{
Flux[back][front]+=md;
Flux[front][back]-=md;
}
}
}
int Fluxu=0;
for (i=1;i<=2*n;i++)
Fluxu+=Flux[i][D];
return Fluxu;
}
int main()
{
FILE* f = fopen("felinare.in","r");
fscanf(f,"%d%d",&n,&m);
for (i=1;i<=m;i++)
{
int x,y;
fscanf(f,"%d%d",&x,&y);
Cap[x][alias(y)]=1;
Cap[y][alias(x)]=1;
A[x][++A[x][0]] = alias(y);
A[y][++A[y][0]] = alias(x);
}
fclose(f);
int cuplaj=GetFlux(SURSA,DESTINATIA);
FILE* g = fopen("felinare.out","w");
fprintf(g,"%d\n",2*n-cuplaj);
fclose(g);
return 0;
}