Cod sursa(job #2565783)

Utilizator nicolaee2Martinescu Nicolae nicolaee2 Data 2 martie 2020 16:45:56
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
#include<bits/stdc++.h>
#include<string.h>

using namespace std;

#define NMAX 1010
#define INF (1<<30)-1

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

int n,m,s;
vector<int> ma[NMAX];
int cap[NMAX][NMAX];
vector<bool> viz(NMAX);
vector<int> t(NMAX);


void citire()
{
   t.assign(n+2,-1);

   fin>>n>>m;
   for(int i=1;i<=m;i++)
   {
      int x,y,c;
      fin>>x>>y>>c;
      cap[x][y] += c;

      ma[x].push_back(y);
      ma[y].push_back(x);
   }

}


int bfs()
{

   viz.assign(n+2,false);
   t.assign(n+2,-1);

   queue<int> q;
   q.push(1);
   viz[1] = 1;

   while(!q.empty())
   {

      int nod = q.front();
      q.pop();

      for(int i=0;i<ma[nod].size();i++)
      {

         int vecin = ma[nod][i];

         if(!viz[vecin] && cap[nod][vecin])
         {
            viz[vecin] = 1;
            t[vecin] = nod;
            q.push(vecin);
         }
      }
   }

   return viz[n];
}

int rezolva()
{
   int flux = 0;

   while(bfs())
   {

      for(int i=0;i<ma[n].size();i++)
      {

         int vecin = ma[n][i];
         //cout<<vecin<<" ";
         if(viz[vecin] == 1 && cap[vecin][n] )
         {

            int fluxm = cap[vecin][n] ;

            int nod = vecin;
            while(nod!=1)
            {
               int vecin = t[nod];
               fluxm = min(fluxm,cap[vecin][nod]);
               nod = vecin;
            }

            flux+=fluxm;

            cap[vecin][n]-=fluxm;
            cap[n][vecin]+=fluxm;

            nod = vecin;
            while(nod!=1)
            {
               int prev = t[nod];
               cap[prev][nod]-=fluxm;
               cap[nod][prev]+=fluxm;
               nod = prev;
            }




         }




      }

   }

   return flux;

}

int main()
{

   citire();
   fout<<rezolva();

}