Cod sursa(job #296339)

Utilizator bacerandreiBacer Andrei bacerandrei Data 4 aprilie 2009 17:40:27
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <fstream.h>

unsigned long int r[1001][1001], flux = 0;
int bf[1001], sel[1001], st,dr,ant[1001];
int n,m,i,a,b,cost, drum[1001];
int indice;

long int minim = 1000000;

int main()
{
	ifstream f("maxflow.in");
	f>>n>>m;
   for(i=1;i<=m;i++)
   {
   	f>>a>>b>>cost;
      r[a][b]=cost;
   }

   f.close();

   int gasit = 0;
   int nod = 0;


   do
   {
   	gasit = 0;

      //bf
      for (i=1;i<=n;i++)
      {
      	bf[i] = 0;
         sel[i] = 0;
         ant[i] = 0;
      }

      st=0;
      dr=1;
      bf[dr]=1;
      sel[1]=1;
      ant[1]=0;


      while(st<=dr)
      {
      	st++;
         nod = bf[st];
         for(i=1;i<=n;i++)
         	if(r[nod][i] && !sel[i])
            {
            	dr++;
               bf[dr] = i;
               sel[i] = 1;
               ant[i] = nod;
               if(i == n)
               	gasit = 1;
            }
      }

      //reconstituirea drumului

      if(gasit)
      {
      	for(i=1; i<=n; i++)
      		drum[i] = 0;

         drum[1] = n;
         indice = 1;
         nod = drum[indice];
         while(ant[nod])
         {
         	indice ++;
            drum[indice] = ant[nod];
            nod = ant[nod];
         }
         //minimul
         minim = 1000000;
         for (i=1; i<indice; i++)
         	if(r[drum[i+1]][drum[i]] < minim)
            	minim = r[drum[i+1]][drum[i]];

         for(i=1; i< indice; i++)
         {
         	r[drum[i+1]][drum[i]] -= minim;
            r[drum[i]][drum[i+1]] += minim;
         }
         flux += minim;
      }//if gasit
	}while(gasit);

   ofstream g("maxflow.out");
   g<<flux<<'\n';
   g.close();

   return 0;
}