Cod sursa(job #286838)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 24 martie 2009 11:21:32
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include <stdio.h>
#include <vector>
#define N 1001
#define inf 0x3f3f3f

using namespace std;

int flux,n,m;
int coada[N],tati[N];
int cp[N][N],F[N][N];
vector <int > V[N];

void citire()
{
     int a,b,cap;
     scanf ("%d %d",&n,&m);
     for (int i=0;i<m;i++)
     {
          scanf ("%d %d %d",&a,&b,&cap);
          cp[a][b]=cap;
          V[a].push_back(b);
          V[b].push_back(a);
     }
}


int viz()
{
     int nr=1,nod,nodf;

     for (int i=2;i<=n;i++)
          tati[i]=0;

     tati[1]=-1;
     coada[0]=1;

     for (int i=0;i<nr;i++)
     {
          nod=coada[i];
          for (typeof V[nod].begin() i=V[nod].begin();i<V[nod].end();i++)
          {
               nodf=*i;

               if (tati[nodf] || cp[nod][nodf]<=F[nod][nodf])
                    continue;

               tati[nodf]=nod;
               coada[nr++]=nodf;

               if (nodf==n)
                    return 1;
          }
     }
     return 0;
}

void solve()
{
     int fl=inf,nod;
     while (viz())
     {
          for (int i=1;i<n;i++)
          {
               if (!tati[i] || cp[i][n]<=F[i][n])
                    continue;

               fl=inf;
               nod=n;

               while (nod!=1)
               {
                    if (fl>cp[tati[nod]][nod]-F[tati[nod]][nod])
                         fl=cp[tati[nod]][nod]-F[tati[nod]][nod];
                    nod=tati[nod];
               }
               if (!fl)
                    continue;
               flux+=fl;
               nod=n;

               while (nod!=1)
               {
                    F[tati[nod]][nod]+=fl;
                    F[nod][tati[nod]]-=fl;
                    nod=tati[nod];
               }
          }
     }
}


int main ()
{
     freopen ("maxflow.in","r",stdin);
     freopen ("maxflow.out","w",stdout);
     citire();
     solve();
     printf("%d\n",flux);
     return 0;
}