Pagini recente » Cod sursa (job #1941845) | Cod sursa (job #2103529) | Istoria paginii runda/prega_oji2015_x_2 | Cod sursa (job #276093) | Cod sursa (job #566617)
Cod sursa(job #566617)
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#define inf 0x3f3f
int c[1010][1010],F[1010][1010],n,m;
int Q[1010],t[1010],min;
int flux,S,D,sw;
FILE *f,*g;
void cit(){
int i,j,x;
f=fopen("maxflow.in","r");
fscanf(f,"%d %d ",&n,&m);
for (;m;--m)
{
fscanf(f,"%d %d %d",&i,&j,&x);
c[i][j]=x;
}
S=1;
D=n;
fclose(f);
}
void afis(){
int i;
flux=0;
for (i=1;i<=n;i++)
flux+=F[i][D];
g=fopen("maxflow.out","w");
fprintf(g,"%d\n",flux);
fclose(g);
}
void gasire_drum(){
int p,u,k,i;
p=u=1;
Q[u]=S;
sw=0;
while (p<=u && !sw)
{
k=Q[p];
for (i=1; i<=n && !sw; i++)
if (c[k][i] > F[k][i] && !t[i])
{
t[i]=k; u++; Q[u]=i;
if (Q[u]==D)
sw=1;
}
else
if (F[i][k]>0 && !t[i] && i!=S)
{
t[i]=-k;
u++;
Q[u]=i;
}
p++;
}
}
void imbunatatire(int k){
if (k!=S)
if (t[k]>0)
{
if (c[t[k]][k]-F[t[k]][k]<min)
min=c[t[k]][k]-F[t[k]][k];
imbunatatire(t[k]);
F[t[k]][k]+=min;
}
else
{
if (F[k][abs(t[k])]<min)
min=F[k][abs(t[k])];
imbunatatire(abs(t[k]));
F[k][abs(t[k])]-=min;
}
}
int main(){
cit();
do{
memset(t,0,sizeof(t));
gasire_drum();
if (sw)
{
min=inf;
imbunatatire(D);
}
}while (sw);
afis();
return 0;
}