Cod sursa(job #2922142)

Utilizator francescom_481francesco martinut francescom_481 Data 4 septembrie 2022 18:05:53
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
#define cin fin
#define cout fout

#define N 1005
int n, m, u, v, f, l[N], start[N];
struct muchie
{
    int v, f, c, rev;
};
vector < vector < muchie > > g;

bool bfs(int s, int t)
{
    for(int i = 1 ; i <= n ; i++)l[i] = -1;
    l[s] = 0;
    queue < int > q;
    q.push(s);
    while(!q.empty())
    {
        int u = q.front();
        q.pop();
        for(auto i : g[u])
        {
            if(l[i.v] < 0  &&  i.f < i.c)
            {
                l[i.v] = l[u]+1;
                q.push(i.v);
            }
        }
    }
    return l[t] < 0 ? false : true ;
}
int trimit(int u, int flow, int t, int start[])
{
    if(u == t)
    {
        return flow;
    }
    for( ; start[u] < g[u].size() ; start[u]++)
    {
        if(l[g[u][start[u]].v] == l[u]+1  &&  g[u][start[u]].f < g[u][start[u]].c)
        {
            int acum = min(flow,g[u][start[u]].c-g[u][start[u]].f);
            int temp = trimit(g[u][start[u]].v,acum,t,start);
            if(temp > 0)
            {
                g[u][start[u]].f += temp;
                g[g[u][start[u]].v][g[u][start[u]].rev].f -= temp;
                return temp;
            }
        }
    }
    return 0;
}
int maxim(int s, int t)
{
    if(s == t)return -1;
    int tot = 0;
    while(bfs(s,t))
    {
        memset(start,0,sizeof(start));
        while(int flow = trimit(s,INT_MAX,t,start))
        {
            tot += flow;
        }
    }
    return tot;
}

int main() {

    cin >> n >> m;
    g.resize(n+5);
    for(int i = 1 ; i <= m ; i++)
    {
        cin >> u >> v >> f;
        g[u].push_back({v,0,f,g[v].size()});
        g[v].push_back({u,0,0,g[u].size()-1});
    }
    cout << maxim(1,n);
    return 0;
}