Cod sursa(job #240854)

Utilizator Sorin_IonutBYSorynyos Sorin_Ionut Data 8 ianuarie 2009 20:21:37
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <stdio.h>
#include <iostream.h>

using namespace std;

#define MAX 1024
#define INF 0x3f3f3f3f
#define IN "maxflow.in"
#define OUT "maxflow.out"

FILE *fin=fopen(IN,"r");
FILE *fout=fopen(OUT,"w");

int g[MAX][MAX];       
int c[MAX][MAX];
int f[MAX][MAX];
int tt[MAX];
int cd[MAX];
int viz[MAX];
int n,m;
int flux;

inline long minim(long,long);
void citire();
void afis();
void alg();
int bf();

int main()
{
 citire();
  fclose(fin);
  
 alg();

 afis();
  fclose(fout);
   
 return 0;
}

void citire()
{
 int i,x,y,z;
     
 fscanf(fin,"%d %d ",&n,&m);
 
 for(i=1;i<=m;i++)
 {
  fscanf(fin,"%d %d %d ",&x,&y,&z);
  c[x][y]=c[x][y]+z;
  g[x][0]++;
  g[x][g[x][0]]=y;
  g[y][0]++;
  g[y][g[y][0]]=x;
 }
}

void afis()
{
 fprintf(fout,"%d\n",flux);    
}

void alg()
{
 int nod,fmin,min,i;
     
 for(flux=0;bf();)
  for(i=1;i<=g[n][0];i++)
  {
   nod=g[n][i];
   
   if(f[nod][n]==c[nod][n] || !viz[nod])
    continue;
    
   tt[n]=nod;
			
   fmin=INF;
   
   for(nod=n;nod!=1;nod=tt[nod]) 
	fmin=minim(fmin,c[tt[nod]][nod]-f[tt[nod]][nod]);
	
   if(fmin==0)
    continue;
			
   for(nod=n;nod!=1;nod=tt[nod])
   {
    f[tt[nod]][nod]=f[tt[nod]][nod]+fmin;
    f[nod][tt[nod]]=f[nod][tt[nod]]-fmin;
   } 
  
   flux=flux+fmin;
  }
}

int bf()
{
 int i,j,nod,v;

 cd[0]=1;
 cd[1]=1;
 
 memset(viz,0,sizeof(viz));
 viz[1]=1;

 for(i=1;i<=cd[0];i++)
 {
  nod=cd[i];
  
  if(nod==n)
   continue;
   
  for(j=1;j<=g[nod][0];j++) 
  {
   v=g[nod][j];
   
   if(c[nod][v]==f[nod][v] || viz[v])
    continue;
    
   viz[v]=1;
   cd[++cd[0]]=v;
   tt[v] = nod;
  }
 }

 return viz[n];
}

inline long minim(long x,long y)
{
 if(x<y)
  return x;
 return y;
}