Cod sursa(job #286248)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 23 martie 2009 16:55:42
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include <stdio.h>
#define N 1001

struct nod
{
     int inf;
     nod *next;
}*sir[N];

int T[N],cp[N][N],F[N][N],coada[N];
int flux,n,m;

void baga(int a,int b)
{
     nod *q=new nod;
     q->inf=a;
     q->next=sir[b];
     sir[b]=q;
}

void citire()
{
     int a,b,f;
     freopen ("maxflow.in","r",stdin);
     freopen ("maxflow.out","w",stdout);
     scanf ("%d %d",&n,&m);
     for (int i=0;i<m;i++)
     {
          scanf ("%d %d %d",&a,&b,&f);
          cp[a][b]=f;
          baga(a,b);
          baga(b,a);
     }
}


int verif()
{
     int nr=0;
     for (int i=2;i<=n;i++)
          T[i]=0;
     T[1]=-1;
     coada[nr++]=1;
     for (int i=0;i<nr;i++)
     {
          for (nod *q=sir[coada[i]];q;q=q->next)
          {
               if (T[q->inf])
                    continue;
               if (cp[coada[i]][q->inf]<=F[coada[i]][q->inf])
                    continue;
               T[q->inf]=coada[i];
               coada[nr++]=q->inf;
               if (q->inf==n)
                    return 1;
          }
     }
     return 0;
}

void solve()
{
     int fl;
     while (verif())
     {
          for (int i=1;i<=n;i++)
          {
               if (!T[i])
                    continue;
               if (cp[i][n]<=F[i][n])
                    continue;
               fl=cp[i][n]-F[i][n];
               int nod=i;
               while (nod!=1)
               {
                    if (fl>cp[T[nod]][nod]-F[T[nod]][nod])
                         fl=cp[T[nod]][nod]-F[T[nod]][nod];
                    nod=T[nod];
               }
               if (!fl)
                    continue;
               flux+=fl;
               F[i][n]+=fl;
               F[n][i]-=fl;
               nod=i;
               while (nod!=1)
               {
                    F[T[nod]][nod]+=fl;
                    F[nod][T[nod]]-=fl;
                    nod=T[nod];
               }
          }
     }
}

int main ()
{
     citire();
     solve();
     printf("%d\n",flux);
     return 0;
}