Cod sursa(job #2579576)

Utilizator denisaaabBucur Denisa Andreea denisaaab Data 12 martie 2020 17:03:09
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#include <vector>
#include <queue>
#define NMAX 1005
#define INF 0x3f3f3f3f
using namespace std;

ifstream f("maxflow.in");
ofstream g("maxflow.out");

vector <int>graph[NMAX];
queue <int>q;

int n, m, x, y, capacitate;
int c[NMAX][NMAX];
int f[NMAX][NMAX];
int viz[NMAX];
int p[NMAX];
int bfs()
{
    q.push(1);
    for(int i=1; i<=n; i++)
        viz[i]=0;
    viz[1]=1;
    while(!q.empty())
    {
        int vf=q.front();
        q.pop();
        if(vf == n)
            continue;
        for(auto &v:graph[vf])
        {
            if(c[vf][v] == f[vf][v] || viz[v])
                continue;
            viz[v]=1;
            q.push(v);
            p[v]=vf;
        }
    }
    return viz[n];
}

int main()
{
    fin>>n>>m;
    int flux,fluxmin;
    for(int i=1; i<=m; i++)
    {
        f>>x>>y>>capacitate;
        graph[x].push_back(y);
        graph[y].push_back(x);
        c[x][y]=capacitate;
    }

    for(flux=0; bfs();)
    {
        for(auto &v:graph[n])
        {
            if(c[v][n] == f[v][n] || !viz[v])
                continue;
            p[n]=v;

            fluxmin=INF;
            for(int vf=n; vf!=1; vf=p[vf])
                fluxmin=min(fluxmin, c[p[vf]][vf]-f[p[vf]][vf]);
            if(fluxmin == 0)
                continue;
            for(int vf=n; vf!=1; vf=p[vf])
            {
                f[p[vf]][vf]+=fluxmin;
                f[vf][p[vf]]-=fluxmin;
            }
            flux+=fluxmin;
        }
    }
    g<<flux;

    return 0;
}