Cod sursa(job #2640914)

Utilizator smoc_georgemarianSmoc George-Marian smoc_georgemarian Data 9 august 2020 11:00:42
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <bits/stdc++.h>
#define NMAX 1009
#define INF 9999999
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

void citire();
void solve();
bool bfs();
int c[NMAX][NMAX];
int f[NMAX][NMAX];
bool uz[NMAX];
int tata[NMAX];

int n,m;
vector<int> g[NMAX];
int main()
{citire();
 solve();

    return 0;
}
void citire()
{
  int i;
  int x,y,cap;
  fin>>n>>m;
  for(i=1;i<=m;i++)
    {
     fin>>x>>y>>cap;
     g[x].push_back(y);
     g[y].push_back(x);
     c[x][y]+=cap;
    }
}
void solve()
{
  int i,rez=0,j;
  for(;bfs();)
    {
     ///inseamna ca am gasit drum si se poate mari fluxul
     ///o luam de la destinatie
     for(i=0;i< g[n].size();i++)
        {
         int vec=g[n][i];
         int minflow=INF;
         if(c[vec][n]!= f[vec][n] && uz[n])///am trecut
            {
             for(j=n;j!=1;j=tata[j])
                 minflow=min(minflow, c[ tata[j]][j]-f[ tata[j]][j]);
             if(minflow==INF)
                continue;
             for(j=n;j!=1;j=tata[j])
                 {
                 f[ tata[j] ][j]+=minflow;
                 f[j][tata[j]]-=minflow;
                 }
             rez+=minflow;
            }
        }

    }

  fout<<rez;
}
bool bfs()
{
  queue<int>Q;
  memset(uz,0,sizeof(uz));
  uz[1]=1;
  Q.push(1);
  while( !Q.empty())
    {
     int act=Q.front();Q.pop();
     int i;
     if(act==n)
        continue;
     for(i=0;i< g[act].size();i++)
        {
          int vec=g[act][i];
          if(!uz[vec] && f[act][vec]<c[act][vec])
                {
                 uz[vec]=1;
                 Q.push(vec);
                 tata[vec]=act;
                }
        }
    }
  return uz[n];
}