Cod sursa(job #2565745)

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

using namespace std;

#define NMAX 1024
#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];
int f[NMAX][NMAX];
vector<bool> viz;
vector<int> t;

void citire()
{
   t.assign(n+1,-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+1,false);

   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] > f[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] > f[vecin][n])
         {

            int fluxm = cap[vecin][n] - f[vecin][n];

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

            flux+=fluxm;

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

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


         }




      }

   }

   return flux;

}

int main()
{

   citire();
   fout<<rezolva();

}