Cod sursa(job #2579553)

Utilizator ana.pintiliciucAna Maria Pintiliciuc ana.pintiliciuc Data 12 martie 2020 16:34:24
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#include <vector>
#include <queue>
#define inf 0x3f3f3f3f

using namespace std;

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

int n, m;
int c[1005][1005];
int fl[1005][1005];
vector<int> gr[1005];
queue<int> q;
bool viz[1005];
int t[1005];

void citire()
{
    f>>n>>m;
    int x, y, cost;
    for(int i=1; i<=m; i++)
    {
        f>>x>>y>>cost;
        c[x][y]=cost;
        gr[x].push_back(y);
        gr[y].push_back(x);
    }
}

bool 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:gr[vf])
        {
            if(c[vf][v]==fl[vf][v] || viz[v]!=0)
                continue;
            viz[v]=1;
            q.push(v);
            t[v]=vf;
        }
    }

    return viz[n];
}

int main()
{
    citire();

    int flux=0, fmin=inf;

    while(bfs()!=0)
    {
        for(auto v:gr[n])
        {
            if(fl[v][n]==c[v][n] || viz[v]==0)
                continue;
            t[n]=v;

            fmin=inf;
            for(int nod=n; nod!=1; nod=t[nod])
                fmin=min(fmin, c[t[nod]][nod]-fl[t[nod]][nod]);
            if(fmin==0)
                continue;

            for(int nod=n; nod!=1; nod=t[nod])
            {
                fl[t[nod]][nod]+=fmin;
                fl[nod][t[nod]]-=fmin;
            }
            flux+=fmin;
        }
    }
    g<<flux;

    return 0;
}