Cod sursa(job #2582389)

Utilizator smoc_georgemarianSmoc George-Marian smoc_georgemarian Data 16 martie 2020 17:54:34
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <bits/stdc++.h>
#define NMAX 1009
#define INF 0x3f3f3f3f
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
vector<int>g[NMAX];
int n,m;
void citire();
void solve();
bool bfs();
int c[NMAX][NMAX];
int f[NMAX][NMAX];

bool uz[NMAX];
int tata[NMAX];

int main()
{citire();
 solve();
    return 0;
}
void citire()
{int x,y;
int i;
 fin>>n>>m;
 for(i=1;i<=m;i++)
    {int cap;
     fin>>x>>y>>cap;
     g[x].push_back(y);
     g[y].push_back(x);
     c[x][y]+=cap;
    }

}
void solve()
{
 int i;
 int sol;
 for(sol=0;bfs();)
    for(i=0;i< g[n].size();i++)
    {
     int vec=g[n][i];
     int minflow=INF;
     if(c[vec][n]!=f[vec][n] && uz[vec])
        {

         for(int ct=n;ct!=1;ct=tata[ct])
            minflow=min(minflow, c[tata[ct]][ct]-f[tata[ct]][ct]);
         for(int ct=n;ct!=1;ct=tata[ct])
            {f[tata[ct]][ct]+=minflow;
            f[ct][tata[ct]]-=minflow;
            }
         sol+=minflow;
        }

    }
 fout<<sol;
}
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();
    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;
            if(vec==n)
                return 1;
            }

        }
    }
  return 0;
}