Cod sursa(job #2574764)

Utilizator victorzarzuZarzu Victor victorzarzu Data 6 martie 2020 09:43:58
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>
#define oo 0x3f3f3f3f
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");

int n, m, x, y, cap;
int C[1005][1005];
int F[1005][1005];
int TT[1005];
bool viz[1005];
int flow, flmin;
vector<int> graf[1001];

void Read()
{
    f>>n>>m;
    for(int i = 1;i <= m;++i)
    {
        f>>x>>y>>cap;
        graf[x].push_back(y);
        graf[y].push_back(x);
        C[x][y] = cap;
    }
}

bool BFS()
{
    memset(viz, false, sizeof(viz));
    viz[1] = true;
    queue<int> q;
    q.push(1);

    while(!q.empty())
    {
        int nod = q.front();
        q.pop();

        if(nod == n) continue;

        for(vector<int>::iterator it = graf[nod].begin();it != graf[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()
{
    Read();
    for(;BFS();)
    {
        for(vector<int>::iterator it = graf[n].begin();it != graf[n].end();++it)
        {
            int nod = *it;

            if(C[nod][n] == F[nod][n] || !viz[nod]) continue;

            TT[n] = *it;

            flmin = oo;

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

            if(flmin == 0) continue;

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