Cod sursa(job #2640919)

Utilizator smoc_georgemarianSmoc George-Marian smoc_georgemarian Data 9 august 2020 11:10:42
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 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
            {
             tata[n]=vec;
             for(j=n;j!=1;j=tata[j])
                 minflow=min(minflow, c[ tata[j]][j]-f[ tata[j]][j]);
             if(!minflow)
                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>H;
 H.push(1);
 memset(uz,0, sizeof(uz));

 uz[1]=1;
 while(!H.empty())
    {
    int act=H.front();H.pop();
    if(act==n) continue;
    for(int i=0;i<g[act].size();i++)
        {
        int vec=g[act][i];
        if(!uz[vec] && c[act][vec]>f[act][vec])
            {
            uz[vec]=1;
            H.push(vec);
            tata[vec]=act;
            }

        }
    }

  return uz[n];
}