Cod sursa(job #3221400)

Utilizator iulianarsenoiuArsenoiu Iulian iulianarsenoiu Data 6 aprilie 2024 23:11:25
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

const int nmax = 1e3;
const int oo = INT_MAX;

int n,m;
vector<int> G[nmax + 5];

int s, d;

int c[nmax + 5][nmax + 5], f[nmax + 5][nmax + 5];

int lvl[nmax + 5];

int poz[nmax + 5];

bool bfs()
{
    for(int i=1; i<=n; i++)
    {
        lvl[i] = -1;
    }
    queue<int> q;
    lvl[s] = 0;
    q.push(s);
    while(!q.empty())
    {
        int nod = q.front();
        q.pop();
        for(auto it : G[nod])
        {
            if(lvl[it] == -1 && c[nod][it] > f[nod][it])
            {
                lvl[it] = 1 + lvl[nod];
                q.push(it);
            }
        }
    }
    return (lvl[d] != -1);
}

int dfs(int nod, int Min)
{
    if(!Min)
    {
        return 0;
    }
    if(nod == d)
    {
        return Min;
    }
    while(poz[nod] < G[nod].size())
    {
        int it = G[nod][poz[nod]];
        if(lvl[it] != lvl[nod] + 1 || c[nod][it] == f[nod][it])
        {
            ++poz[nod];
            continue;
        }
        int add = dfs(it, min(Min, c[nod][it] - f[nod][it]));
        if(add)
        {
            f[nod][it] += add;
            f[it][nod] -= add;
            return add;
        }
        ++poz[nod];
    }
    return 0;
}

int max_flow()
{
    int flux = 0;
    while(bfs())
    {
        for(int i=1; i<=n; i++)
        {
            poz[i] = 0;
        }
        int add = 0;
        while(true)
        {
            add = dfs(s, oo);
            if(add == 0)
            {
                break;
            }
            flux += add;
        }
    }
    return flux;
}

int main()
{
    fin>>n>>m;
    s = 1, d = n;
    for(int i=1; i<=m; i++)
    {
        int x,y,cap;
        fin>>x>>y>>cap;
        if(!c[y][x])
        {
            G[x].push_back(y);
            G[y].push_back(x);
        }
        c[x][y] = cap;
    }
    fout<<max_flow()<<'\n';
    return 0;
}