Cod sursa(job #1259866)

Utilizator rebound212Mihnea Savu rebound212 Data 10 noiembrie 2014 17:41:55
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <algorithm>
#include <cstdio>
#include <cstring>
#define MP make_pair
#define PB push_back
#define W 1001
#include <vector>
using namespace std;
vector <int> G[1005];
vector <int> :: iterator it;
int  c[W][W],f[W][W],i,n,m,t[W],q[W],p,u,nod,fluxminim,flow,x,y,cap;
inline bool BF()
{
    memset(t,0,sizeof(t));
    p=u=0;
    q[p]=1;
    while(p<=u)
    {
        nod=q[p];
        for(it=G[nod].begin(); it!=G[nod].end(); ++it)
        {
            if(!t[*it] && c[nod][*it]>f[nod][*it])
            {
                t[*it]=nod;
                q[++u]=*it;
                if(*it==n) return 1;
            }

        }
        p++;
    }
    return 0;

}
int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(i=1; i<=m; i++)
    {
        scanf("%d %d %d",&x,&y,&cap);
        c[x][y]=cap;
   G[x].PB(y);
  G[y].PB(x);
    }
    flow=0;
    int l;


    while( BF())
    {  for(it=G[n].begin(); it!=G[n].end(); ++it)
       {
         if(t[*it] && c[*it][n]>f[*it][n])
       {  t[n]=*it;

           fluxminim=1000000000;
        i=n;
        while(i!=1)
        {
            if (fluxminim>c[t[i]][i]-f[t[i]][i]) {fluxminim=c[t[i]][i]-f[t[i]][i];  }
            i=t[i];
        }
        if(fluxminim<0) continue;
        i=n;
        while(i!=1)
        {
            f[t[i]][i]+=fluxminim;
            f[i][t[i]]-=fluxminim;
            i=t[i];
        }
        flow+=fluxminim;
       }
       }
    }
    printf("%d\n",flow);


    return 0;
}