Cod sursa(job #1356909)

Utilizator radu2004GOLD radu radu2004 Data 23 februarie 2015 17:29:57
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <stdio.h>
#include <string.h>
#include <deque>
#include <vector>
using namespace std;
FILE *f1,*g;
deque <int> q;
vector <int> v[1005];
int n,m,c1,c[1005][1005],i,flow,f[1005][1005],tata[1005];

int bf ()
{
  memset (tata,0,sizeof (tata));
    int nod;
    tata[1]=-1;
     q.erase (q.begin (),q.end());
    q.push_back (1);

    while (! q.empty())
    {
        nod=q.front ();
        for (int j=0;j<v[nod].size ();j++)
        {
            int x=v[nod][j];
            if (c[nod][x]-f[nod][x]>0 && tata[x]==0)
            {
                q.push_back (x);
                tata[x]=nod;
                if (x==n) return 1;
            }
        }
       q.pop_front ();
    }

         return 0;
}
int main()
{ f1=fopen ("maxflow.in","r");
  g=fopen ("maxflow.out","w");
  fscanf (f1,"%d%d",&n,&m);
  int x,y,nod;
  for (i=1;i<=m;i++)
  {
      fscanf (f1,"%d%d%d",&x,&y,&c1);
      v[x].push_back (y);
      v[y].push_back (x);
      c[x][y]=c1;
  }
 int min1;
  while (bf ())
  {
      for (i=0;i<v[n].size();i++)
      {
          nod=v[n][i];
          if (f[nod][n]==c[nod][n] || tata[nod]==0) continue;
          tata[nod]=n;
          nod=n;
          min1=0x3f3f3f3f;
          while (nod!=1)
          {
              min1=min (min1,c[nod][tata[nod]]) - f[tata[nod]][nod];
          }
          if (min1==0) continue;
          nod=n;
          while (nod!=1)
      {

        f[tata[nod]][nod]+=min1;
        f[nod][tata[nod]]-=min1;
        nod=tata[nod];
      }
      flow+=min1;
      }
  }
 fprintf (g,"%d",flow);
    return 0;
}