Cod sursa(job #768325)

Utilizator igsifvevc avb igsi Data 16 iulie 2012 17:04:05
Problema Flux maxim Scor 70
Compilator c Status done
Runda Arhiva educationala Marime 1.35 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define max_n 1001

FILE *in, *out;
int c[max_n][max_n], f[max_n][max_n], t[max_n], n, m, flux;


int bf(int s,int d)
{
    int li, ls, nod, q[max_n], i;
    
    memset(t,0,sizeof(t));
    
    for(li=0, ls=0, t[s]=-1, q[0]=s; li<=ls; li++)
    {
       nod = q[li];
       if(nod == d) continue;
       for(i = 1; i<=n; i++)
          if(!t[i] && c[nod][i] > f[nod][i])
          {
             q[++ls] = i;
             t[i] = nod;
          }
    }
    return t[d];
}

int main()
{
    int i, j, r, x, y, z, s, d;
    
    in = fopen("maxflow.in", "r");
    out = fopen("maxflow.out", "w");
    
    fscanf(in, "%d %d", &n, &m);
    for(i=1; i<=m; i++)
    {
   		fscanf(in, "%d %d %d", &x, &y, &z);
   		c[x][y]=z;
    }
    
    s = 1;
    d = n;
    for(flux = 0; bf(s,d);)
		for(j = 1; j <= n; ++j) 
		{
			if(j == s || c[j][d] <= f[j][d]) continue;
			
			r = c[j][d] - f[j][d];
      		for(i = j; t[i] != -1 && i; i = t[i])
      			if(r > c[t[i]][i]-f[t[i]][i])
        			r = c[t[i]][i]-f[t[i]][i];
       		
       		if(!r) continue;
       		
       		f[j][d] += r;
       		f[d][j] -= r;
      		for(i = j; t[i] != -1 && i; i = t[i])
         		f[t[i]][i]+=r,
         		f[i][t[i]]-=r;
         	
         	flux += r;
    }
    
    fprintf(out, "%d\n", flux);
    
    fclose(in);
    fclose(out);
    return 0;
}