Cod sursa(job #1127736)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 27 februarie 2014 13:38:07
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define Nmax 1009
#define Mmax 5009
#define pb push_back
#define mp make_pair
#include <queue>
#include <cstring>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");

int N,M,Cap[Nmax][Nmax],flow[Nmax][Nmax],maxFlow,ante[Nmax],Sink,Source;
vector < int > G[Nmax];
queue <int > Q;

void ReadInput()
{
     f>>N>>M;
     Source=1,Sink=N;
     for(int i=1;i<=M;++i)
     {
          int x,y,c;
          f>>x>>y>>c;
          G[x].pb(y),G[y].pb(x);
          Cap[x][y]+=c;
     }
}

int BFS()
{
     memset(ante,0,sizeof(ante));
     ante[Source]=Source;
     for(Q.push(Source); !Q.empty(); Q.pop())
     {
          int node=Q.front();
          if(node==Sink)continue;
          for(vector<int>::iterator it=G[node].begin();it!=G[node].end();++it)
               if(!ante[*it] && flow[node][*it]<Cap[node][*it])
               {
                    ante[*it]=node;
                    Q.push(*it);
               }
     }
     return ante[Sink];
}

void GetFlow()
{
     for( ; BFS();)
          for(vector<int>::iterator it=G[Sink].begin();it!=G[Sink].end();++it)
               if(ante[*it] && flow[*it][Sink]<Cap[*it][Sink])
               {
                    ante[Sink]=*it;
                    int minFlow=2000000000;
                    for( int i=Sink; i!=Source ; i=ante[i])
                         minFlow=min(minFlow,Cap[ante[i]][i]-flow[ante[i]][i]);
                    if(minFlow)
                    {
                         for( int i=Sink; i!=Source ; i=ante[i])
                         {
                              flow[ante[i]][i]+=minFlow;
                              flow[i][ante[i]]-=minFlow;
                         }
                         maxFlow+=minFlow;
                    }
               }
}

int main()
{
     ReadInput();
     GetFlow();
     g<<maxFlow<<'\n';
     f.close();g.close();
     return 0;
}