Cod sursa(job #2566025)

Utilizator victorzarzuZarzu Victor victorzarzu Data 2 martie 2020 18:25:43
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n,m,flow;
vector<vector<int>> a(1001,vector<int>());
int C[1001][1001];
int TT[1001];
bool viz[1001];
int F[1001][1001];

void Citire()
{
      int x,y,capacitate;
      f>>n>>m;
      for(int i=1;i<=m;++i)
      {
          f>>x>>y>>capacitate;
          C[x][y] = capacitate;
          a[x].push_back(y);
          a[y].push_back(x);
      }
}

bool BFS()
{
    int nod;
    memset(viz, false, sizeof(viz));
    queue<int> q;
    q.push(1);
    viz[1] = true;
    while(!q.empty())
    {
        nod = q.front();
        q.pop();

        if(nod == n) continue;

        for(vector<int>::iterator it = a[nod].begin();it != a[nod].end();++it)
        {
            if(C[nod][*it] == F[nod][*it] || viz[*it]) continue;
            viz[*it] = true;
            q.push(*it);
            TT[*it] = nod;
        }
    }
    return viz[n];
}

int main()
{
    int nod,fmin;
    Citire();
    for(;BFS();)
    {
        for(vector<int>::iterator it = a[n].begin();it != a[n].end();++it)
        {
            nod = *it;
            if(C[nod][n] == F[nod][n] || !viz[*it]) continue;

            TT[n] = *it;

            fmin = INFINITY;

            for(nod = n;nod != 1; nod = TT[nod])
                fmin = min(fmin, C[TT[nod]][nod] - F[TT[nod]][nod]);

            if(fmin == 0) continue;

            for(nod = n;nod != 1; nod = TT[nod])
            {
                F[TT[nod]][nod] += fmin;
                F[nod][TT[nod]] -= fmin;
            }
            flow += fmin;
        }
    }
    g<<flow;
    return 0;
}